javascript - 不理解 JavaScript 原型(prototype)

标签 javascript prototype

我正在阅读 JavaScript Good Parts。有一个例子:

if (typeof Object.create !== 'function') {
    Object.create = function(o) {
        var F = function(){};
        F.prototype = o;
        return new F();
    }
}

谁能给我解释一下这是什么意思吗?首先,对象已经有一个具有此名称的方法,因为当我运行它时:

console.log(typeof Object.create);

输出是“函数”?

最佳答案

要回答您的“首先...”,您可能仍然会遇到 Javascript 环境

console.log(typeof Object.create);

将报告

undefined

或类似的东西(假设您甚至有一个具有可用日志功能的控制台对象。)外部 if (typeof Object.create !== 'function') 的原因包装器仅在您的 JS 环境尚未这样做的情况下定义它。有许多较旧的浏览器和其他环境,您的代码有一天可能会运行,但可以想象没有 Object.create已定义。

现在至于这个实际函数是如何工作的,它基于 JS 如何处理对象。对象只是命名属性的集合,或者更准确地说是字符串名称和属性值之间的关联。但许多也有一个特殊的属性,那就是它们的 prototype 。这只是一个指向另一个对象的指针。该对象也可以有自己的 prototype对象,等等。但最终,当prototype出现时,原型(prototype)链就消失了。这些对象之一为空。这些原型(prototype)对象也是命名属性的集合,当 Javascript 引擎在你的对象中搜索命名属性时,如果它没有直接在你的对象上找到它,它会检查你的对象的原型(prototype)是否可能包含它,如果不,如果该对象的原型(prototype)可能包含它,依此类推,直到链消失。

这些原型(prototype)对象的要点是它们可以共享。几个对象,甚至几百万个对象,可以共享一个原型(prototype)。这与基于类的继承方案的工作方式有很大不同,但通常可以用于类似的目的。您可以定义函数的单个副本,并且从公共(public)构造函数创建的所有对象都将使用该副本。在 Object.create 等技术之前创建后,这是在 Javascript 中进行面向对象编程的唯一真正方法。

Crockford 的代码使用旧技术来模拟新技术应该做的部分事情。 Object.create定义了一些无法通过旧机制真正实现的行为,但最基本的行为只是创建一个原型(prototype)为指定对象的新对象。这正是旧技术,使用 F.prototype = o; return new F();完成了。因此,这段代码几乎是将新行为融入旧环境的标准方法。有关此方面的另一个示例,请参阅 MDN create page

关于javascript - 不理解 JavaScript 原型(prototype),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11379489/

相关文章:

javascript - 在 Moovweb 上时,javascript 是否必须捆绑到一个文件中?

javascript - (dart)我想要触发两个不同的 onclick 函数,具体取决于单击时是否选中单选按钮。我怎么做?

javascript - 函数应该附加到对象或其原​​型上吗?

javascript - 当 String 在 JavaScript 中工作时,无法在 Number 上调用声明的原型(prototype)

Javascript - 帮助原型(prototype)和属性?

javascript - 如何向状态 Hook 添加键?

javascript - 规范化数组方法和返回值

javascript - 从底部 css 动画中提升(显示)文本

javascript - 在这种情况下如何进行原型(prototype)继承?

javascript - 更改原型(prototype)中的值在 JavaScript 中不起作用