我正在阅读 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/