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

标签 javascript prototype

人们常说每个 Javascript 对象都有一个 prototype 属性,但我发现只有当 foofoo.prototype 才有值是一个函数。

在 Chrome 和 Firefox 上,obj.__proto__ 有一个值——这是 prototype 属性吗?但是在 IE 9 上,它不会工作(有什么方法可以吗?),我认为通过 prototype 属性,这意味着 obj.prototype 应该工作?

我明白 Object.getPrototypeOf(obj) 似乎显示了这个 prototype 属性,但为什么需要一个特殊的方法来获取它?为什么不像person.name,就是获取person对象的name属性呢?


更新:顺便说一下,obj.constructor.prototype 似乎有时是原型(prototype),但有时不是,如下所示使用没有构造函数的原型(prototype)继承完成的代码:(此方法在 Apress 2008 年 Harmes 和 Diaz 的 Pro Javascript Design Patterns 一书中,第 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]],它指向它直接继承的对象。这在 FF 和 Chrome 中通过非标准的 __proto__ 属性公开。 Object.getPrototypeOf 是此内部属性的 getter。

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

如果你得到一个函数的 [[prototype]](每个函数都是一个对象,所以它有一个),它会产生 Function.prototype 对象,函数从中继承它们的方法(如绑定(bind)、调用、应用等)。另见 Why functions prototype is chained repeatedly?

关于javascript - 据说所有 Javascript 对象都有一个原型(prototype)属性,但如果 foo 是一个函数,我只看到 foo.prototype ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12661416/

相关文章:

Javascript 原型(prototype)类继承

javascript - process.on ('uncaughtException' ) 在 ES6 模块中处理

javascript - 仅在可见区域在 Canvas 上绘制

javascript - 如何修复提交按钮激活错误?

javascript - 在三重奏中拆分字符串并使用javascript从右到左连接一个点

javascript - 在 Function.prototype 中得到 "TypeError: Cannot convert undefined or null to object"

javascript - 如何使用原型(prototype)创建类而不使用 "new"和 "this"

JavaScript 原型(prototype)覆盖

javascript - Framer.js 工作室 PSD

javascript - Footable doSort 根本不起作用