gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:15:32 26 4
gpt4 key购买 nike

在 Javascript 的原型(prototype)继承系统中,对象的内部原型(prototype)引用被设置为其构造函数的“原型(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

为什么?有什么区别?

最佳答案

当你这样做时:

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

关于javascript - *在*构造函数中声明的属性在实例中可见。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4709245/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com