在Javascript的原型继承系统中,对象的内部原型引用被设置为其构造函数的“prototype”属性,该属性本身就是一个对象。
可以解析构造函数的“prototype”属性的属性,就好像它们是对象实例的属性一样。但是,构造函数对象的实际属性不可供实例访问:
function MyConstructor() { }
MyConstructor.x = 3
MyConstructor.prototype.y = 7
a = new MyConstructor()
a.x == 3 // FALSE
a.y == 7 // TRUE
但是,如果构造函数的属性(“x
”)在函数体中使用this
关键字声明,则这些属性当然是 :
function MyConstructor() {
this.x = 3
}
MyConstructor.prototype.y = 7
a = new MyConstructor()
a.x == 3 // TRUE
为什么呢?有什么区别?
答案 0 :(得分:6)
执行此操作时:
MyConstructor.x = 3;
...您只是向MyConstructor
引用的Function对象实例添加了一个属性。 Function对象有许多属性不会成为实例的一部分(您也不希望它们)。
因此,通过构造函数创建实例属性的机制是使用this.x
方法。
构造函数运行时,this
是正在返回的对象。所以这只是一个方便,所以你不必这样做:
a = new MyConstructor();
a.x = 3;
a.x == 3 // TRUE!
由于构造函数中的this
与生成的对象相同,因此无需在每次创建新实例时显式执行此操作。
prototype
对象只是MyConstructor
所有实例引用的对象,因此如果实例上没有属性,则会转到prototype
查找之一。
为了说明this
与新实例之间的关系,请考虑以下示例:
示例: http://jsfiddle.net/M2prR/
var test; // will hold a reference to "this"
function MyConstructor() {
test = this; // make "test" reference "this"
}
// create a new instance
var inst = new MyConstructor;
// see if they are the same object. This will alert "true"
alert( inst === test );