在构造函数中声明*的属性在实例中可见。为什么?

时间:2011-01-17 01:15:01

标签: javascript oop inheritance prototype this

在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

为什么呢?有什么区别?

1 个答案:

答案 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 );