Javascript 构造函数中声明的属性*在实例中可见。为什么?
在Javascript的原型继承系统中,对象的内部原型引用被设置为其构造函数的“原型”属性,该属性本身就是一个对象 构造函数的“原型”属性的属性可以解析为对象实例的属性。但是,实例无法访问构造函数对象的实际属性:Javascript 构造函数中声明的属性*在实例中可见。为什么?,javascript,oop,inheritance,prototype,this,Javascript,Oop,Inheritance,Prototype,This,在Javascript的原型继承系统中,对象的内部原型引用被设置为其构造函数的“原型”属性,该属性本身就是一个对象 构造函数的“原型”属性的属性可以解析为对象实例的属性。但是,实例无法访问构造函数对象的实际属性: function MyConstructor() { } MyConstructor.x = 3 MyConstructor.prototype.y = 7 a = new MyConstructor() a.x == 3 // FALSE a.y == 7 // TRU
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
为什么??区别是什么?当您这样做时:
MyConstructor.x = 3;
…您只向MyConstructor引用的函数对象实例添加了一个属性。函数对象有许多属性没有成为实例的一部分(您也不希望它们成为实例的一部分)
因此,通过构造函数创建实例属性的机制是使用this.x
方法
当构造函数运行时,这是返回的对象。因此,这只是一种方便,您无需:
a = new MyConstructor();
a.x = 3;
a.x == 3 // TRUE!
由于构造函数中的此
与生成的对象相同,因此无需在每次创建新实例时显式执行此操作
prototype
对象只是一个被MyConstructor
的所有实例引用的对象,因此,如果实例上没有属性,它就会转到prototype
查找一个
来说明<代码> < <代码>与新实例之间的关系,请考虑这个例子:
示例:
执行此操作时:
MyConstructor.x = 3;
…您只向MyConstructor引用的函数对象实例添加了一个属性。函数对象有许多属性没有成为实例的一部分(您也不希望它们成为实例的一部分)
因此,通过构造函数创建实例属性的机制是使用this.x
方法
当构造函数运行时,这是返回的对象。因此,这只是一种方便,您无需:
a = new MyConstructor();
a.x = 3;
a.x == 3 // TRUE!
由于构造函数中的此
与生成的对象相同,因此无需在每次创建新实例时显式执行此操作
prototype
对象只是一个被MyConstructor
的所有实例引用的对象,因此,如果实例上没有属性,它就会转到prototype
查找一个
来说明<代码> < <代码>与新实例之间的关系,请考虑这个例子:
示例:
谢谢,没问题<代码>此
引用正在创建的实例,而不是构造函数。回想起来很明显!要验证:a.hasOwnProperty('x')/=>TRUE
(确认x
是a
的属性,并且不会通过原型链进行检索。)@Benji XVI:不客气。我添加了一个例子,进一步说明了这一点<代码>此
引用正在创建的实例,而不是构造函数。回想起来很明显!要验证:a.hasOwnProperty('x')/=>TRUE
(确认x
是a
的属性,并且不会通过原型链进行检索。)@Benji XVI:不客气。我添加了一个例子,进一步说明了这一点。