人们常说每个 Javascript 对象都有一个prototype
属性,但我发现foo.prototype
只有当foo
它是一个函数时它才有一个值。
在 Chrome 和 Firefox 上,obj.__proto__
有一个值——这是所说的prototype
属性吗?但是在 IE 9 上,它不起作用(有什么方法可以吗?),我认为通过prototype
属性,这意味着obj.prototype
应该起作用吗?
我明白这Object.getPrototypeOf(obj)
似乎显示了这个prototype
属性,但是为什么需要一个特殊的方法来获取它呢?为什么不直接like person.name
,也就是获取对象的name
属性person
呢?
更新:顺便说一句,有时obj.constructor.prototype
似乎是那个原型,但有时不是,如以下代码中没有构造函数的原型继承:(此方法在 Apress 的 Harmes 和 Diaz 的 Pro Javascript Design Patterns 书中 2008,p . 46)
var Person = {
name: 'default value',
getName: function() {
return this.name;
}
}
var reader = clone(Person);
console.log(reader.getName());
reader.name = "Ang Lee";
console.log(reader.getName());
function clone(obj) {
function F() {};
F.prototype = obj;
return new F;
}
console.log("the prototype of reader is", Object.getPrototypeOf(reader));
console.log(Object.getPrototypeOf(reader) === reader.constructor.prototype);
console.log(Object.getPrototypeOf(reader) == reader.constructor.prototype);
console.log(Object.getPrototypeOf(reader) === reader.__proto__);
console.log(Object.getPrototypeOf(reader) == reader.__proto__);
结果将显示最后 4 行的 false、false、true、true。