function Foo() {}
var foo = new Foo();
console.log(foo.prototype);// undefined
console.log(foo.__proto__ === Foo.prototype);// true
console.log(Foo.prototype);// [object Object]
console.log(Foo.prototype.prototype);// undefined
想请问一下哪些对象是没有prototype属性的,为什么没有,我暂时知道的就是两种对象:
1.这里的foo实例对象没有prototype属性,但是Foo函数不也是Function的实例么,为什么它就有prototype属性呢?
2.就是构造函数的prototype属性对象应该也是没有prototype属性,只有__proto__,或者说[[prototype]]属性的,对么。
或者说一说创建什么对象的时候prototype和__proto__就创建了?
只有函数对象有
prototype
属性(一般对象自己加的不算)1、
foo
是Foo
的一个实例,但是不是一个函数,所以没有prototype
;Foo
是Function
的一个实例,而Function
是一个函数,他的实例Foo
也是一个函数,所以他们都有prototype
。此外Object Array RegExp
等也是函数。Math
就仅仅是一个new Object()
,不是函数。2、构造函数的prototype,默认情况下就是一个
new Object()
还额外添加了一个constructor
属性。所以说默认是没有prototype
只有__proto__
的。除了
Object.prototype
这个对象,其他所有的对象都会有__proto__
属性,之后函数才会有prototype
属性。在创建对象的时候会自动创建一个
__proto__
属性,指向它构造函数的prototype
,当访问这个对象的属性的时候会顺带访问__proto__
中对应的属性,也就是构造函数prototype
这样实现了继承。只有创建函数的时候才会创建一个
prototype
属性,目的就是为了完成上面的继承方式。附早年画的一个图(橙色箭头是初始的关系,绿色是执行
var Fish = new Fu...
创建,蓝色是执行f1= new Fish()
创建。)这样
f1
就可以通过__proto__
访问Fish.prototype
中的属性(当然这是程序执行的时候自动查找的)。Fish就可以访问 Function.prototype定义的属性。所有对象都可以访问Object.prototype
中的属性。有点儿复杂,自己仔细理一理。