奇怪的原型指向

时间:2012-03-04 14:55:28

标签: javascript

我正在读这个:http://killdream.github.com/blog/2011/10/understanding-javascript-oop/index.html

我遇到了一些我无法理解的代码:

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

为什么他在Object.defineProperty上使用Person.prototype而不是简单地在Person上? 为什么不简单地在定义中包含name或制作Person.name = bla...

(编辑:已解决) 另外,为什么我看到这个无限循环的原型参考?

why am i seeing this endless loop of prototype reference?

1 个答案:

答案 0 :(得分:6)

如果他在Object.defineProperty上使用Person,那么您就可以在使用new Person创建的实例上定义该功能的属性,

即。给定Object.defineProperty(Person, ...)你能够做到

Person.name = 'foo';

但在这种情况下这不会有所帮助。

另一方面,原型的属性由所有实例共享,因此在原型上定义此属性是有意义的。

此处Person构造函数,应该使用new关键字调用。它可能有助于to read about what new is doing,以便了解为什么Person.prototype必须延长 要点:当使用new进行调用时,在函数内部,this将引用从Person.prototype继承的空对象。

关于第二部分:每个函数都有一个prototype属性,每个原型都有一个constructor属性引用它的“父”函数。因此,您有一个自引用结构:

Person.prototype.constructor === Person;

你展示的是原型链,可以通过检查__proto__来揭示。

我可以用以下方式模拟:

var a = {};
a.b = {a: a};

我可以无限期访问a.b.a.b.a.b.a.b.a.b.a