我认为差异已经在我脑海中响起,但我想确定一下。
在 Douglas Crockford 页面Prototypal Inheritance in JavaScript上,他说
在原型系统中,对象继承自对象。然而,JavaScript 缺少执行该操作的运算符。相反,它有一个 new 运算符,这样 new f() 会生成一个继承自 f.prototype 的新对象。
我真的不明白他在这句话中想说什么,所以我做了一些测试。在我看来,关键的区别在于,如果我在纯原型系统中基于另一个对象创建一个对象,那么所有父父成员都应该在新对象的原型上,而不是在新对象本身上。
这是测试:
var Person = function(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.toString = function(){return this.name + ', ' + this.age};
// The old way...
var jim = new Person("Jim",13);
for (n in jim) {
if (jim.hasOwnProperty(n)) {
console.log(n);
}
}
// This will output 'name' and 'age'.
// The pure way...
var tim = Object.create(new Person("Tim",14));
for (n in tim) {
if (tim.hasOwnProperty(n)) {
console.log(n);
}
}
// This will output nothing because all the members belong to the prototype.
// If I remove the hasOwnProperty check then 'name' and 'age' will be output.
我的理解是否正确,只有在测试对象本身的成员时差异才会变得明显?