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,…,则每个实例都将具有该属性,因为它们都继承自该对象。不知道如何更清楚地说明这一点。每个实例都继承自构造函数的原型,因此您在原型上定义了应由所有实例共享的属性。