![](/img/trans.png)
[英]Javascript: Why is it Foo.prototype = Object.create(Bar.prototype) where Foo inherits from Bar
[英]It is said that all Javascript objects have a prototype property, but I only see foo.prototype if foo is a function?
通常说每个Javascript对象都有一个prototype
属性,但我发现只有当foo
是一个函数时, foo.prototype
才有值。
在Chrome和Firefox上, obj.__proto__
有一个值 - 这就是所说的prototype
属性吗? 但是在IE 9上,它不起作用(有某种方式可以吗?),我认为通过prototype
属性,这意味着obj.prototype
应该有效吗?
我明白Object.getPrototypeOf(obj)
似乎显示了这个prototype
属性,但为什么需要一个特殊的方法来获取它呢? 为什么不喜欢person.name
,这是获取person
对象的name
属性?
更新:顺便说一句, obj.constructor.prototype
似乎有时候就是那个原型,但有时却没有,就像下面的代码用Prototypal继承完成而没有构造函数:(这个方法在Harmes和Diaz的Pro Javascript Design Patterns一书中)作者:Apress 2008,第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。
每个JavaScript对象都有一个内部的“prototype”属性,通常称为[[prototype]],它指向它直接继承的对象。 这是由非标准__proto__
属性在FF和Chrome中公开的。 Object.getPrototypeOf
是此内部属性的getter。
每个JavaScript函数[object]都有一个属性prototype
,用一个[几乎]空对象初始化。 当您通过将其作为构造函数调用来创建此函数的新实例时,该新对象的[[prototype]]将指向构造函数的prototype
对象。
如果你得到一个函数的[[prototype]](每个函数都是一个对象,所以它有一个),它将导致Function.prototype
对象,函数继承它们的方法(如bind,call,apply等)。 另请参见为什么函数原型被重复链接? 在那。
它是每个Object的constructor
都有一个prototype
。 所以对于一些foo
, bar
或foobar
:
var foo = {};
console.log(foo.constructor.prototype); //=> Object
var bar = 5;
console.log(bar.constructor.prototype); //=> Number
function Foobar(){}
var foobar = new Foobar; //Foobar used a constructor
console.log(foobar.constructor.prototype); //=> Foobar
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.