我正在读这个: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...
?
(编辑:已解决) 另外,为什么我看到这个无限循环的原型参考?
答案 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
。