繁体   English   中英

据说所有Javascript对象都有一个prototype属性,但是如果foo是一个函数,我只看到foo.prototype?

[英]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 所以对于一些foobarfoobar

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM