18

人们常说每个 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。

4

2 回答 2

16

每个 JavaScript 对象都有一个内部“原型”属性,通常称为 [[prototype]],它指向它直接继承的对象。这在 FF 和 Chrome 中由非标准__proto__属性公开。Object.getPrototypeOf是这个内部属性的吸气剂。

每个 JavaScript 函数 [object] 都有一个 property prototype,它用一个 [几乎] 空的 object 进行初始化。当您通过将其作为构造函数调用来创建此函数的新实例时,该新对象的 [[prototype]] 将指向构造函数的prototype对象。

如果你得到一个函数的 [[prototype]](每个函数都是一个对象,所以它有一个),它将导致Function.prototype函数继承其方法(如绑定、调用、应用等)的对象。另请参阅为什么函数原型被重复链接?在那。

于 2012-09-30T13:12:46.883 回答
5

它是constructor每个具有prototype. 所以对于一些foo, baror 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
于 2012-09-30T13:03:20.777 回答