Javascript 奇怪的原型指向
我正在读: 我遇到了一些我无法理解的代码:Javascript 奇怪的原型指向,javascript,Javascript,我正在读: 我遇到了一些我无法理解的代码: function Person(first_name, last_name) { this.first_name = first_name this.last_name = last_name } // Defines the `name' getter/setter Object.defineProperty(Person.prototype, 'name', { get: get_full_name
function Person(first_name, last_name) {
this.first_name = first_name
this.last_name = last_name
}
// Defines the `name' getter/setter
Object.defineProperty(Person.prototype, 'name', { get: get_full_name
, set: set_full_name
, configurable: true
, enumerable: true })
为什么他在Person.prototype
上使用Object.defineProperty
,而不仅仅是在Person
上?
为什么不简单地在定义中包含name
,或者使Person.name=bla…
(编辑:已解决)
还有,为什么我会看到这个无休止的原型参考循环
如果他在
Person
上使用Object.defineProperty
,那么你应该在该函数上定义一个属性,而不是在你用new Person
创建的实例上定义一个属性
例如,给定Object.defineProperty(Person,…)
您能够执行的操作
Person.name = 'foo';
但在这种情况下,这并没有真正的帮助
另一方面,原型的属性由所有实例共享,因此在原型上定义此属性是有意义的
这里的Person
是一个构造函数,应该用new
关键字调用它。这可能有助于理解为什么必须扩展Person.prototype。要点:当使用
new
调用时,在函数内部,此
将引用继承自Person.prototype
的空对象
关于第二部分:每个函数都有一个原型
属性,每个原型都有一个构造函数
属性,该属性引用其“父”函数。因此,您有一个自引用结构:
Person.prototype.constructor === Person;
您显示的是而不是原型链,可以通过检查\uuuu proto\uuuu
来显示原型链
我可以用以下方法模拟相同的情况:
var a = {};
a.b = {a: a};
我可以无限期地访问
a.b.a.b.a.b.a.b.a
。thanx,但我不确定我是否完全理解了第一部分:当我使用Object.defineProperty时(Person.prototype
我正在获得在Person
的任何实例上使用getter/setter函数的能力?或者我弄错了吗?基本上是的,这就是您想要扩展原型的原因。我刚刚添加了另一方面,原型的属性由所有实例共享,因此在原型。这就是我们使用原型继承的原因。如果是这样,为什么直接向构造函数添加属性与通过prototype
添加属性之间有区别?当您使用new
关键字调用函数时,会创建一个从函数原型继承的空对象(即功能原型
)。这就是此
在函数中所指的内容。但是,分配给函数的其他属性没有特殊意义。例如,函数也有apply
和call
属性,但它们与使用new
关键字调用函数时发生的情况完全无关。在end、 函数也是对象,因此JavaScript允许您像分配任何其他对象一样为它们分配属性。不。guy
没有对象的prototype
属性。只有函数有。您可以执行object.defineProperty(guy,…
但是只有这个实例才具有该属性,并且您必须为创建的每个实例都这样做(Person.prototype,…,则每个实例都将具有该属性,因为它们都继承自该对象。不知道如何更清楚地说明这一点。每个实例都继承自构造函数的原型,因此您在原型上定义了应由所有实例共享的属性。