Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 构造函数中声明的属性*在实例中可见。为什么?_Javascript_Oop_Inheritance_Prototype_This - Fatal编程技术网

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

在Javascript的原型继承系统中,对象的内部原型引用被设置为其构造函数的“原型”属性,该属性本身就是一个对象

构造函数的“原型”属性的属性可以解析为对象实例的属性。但是,实例无法访问构造函数对象的实际属性:

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:不客气。我添加了一个例子,进一步说明了这一点。