只有3行代码,但我仍然不能完全掌握它:
Object.create = function (o) {
function F() {}
F.prototype = o;
return new F();
};
newObject = Object.create(oldObject);
(来自原型继承)
Object.create()
首先创建了一个名为F
的空函数。我认为函数是一种对象,那么F
对象被存储在哪里呢?我猜是全局的。接下来,我们传入的
oldObject
,也就是o
,成为了函数F
的原型。函数(即对象)F
现在“继承”于我们的oldObject
,这意味着名称解析将通过它进行路由。很好,但我想知道一个对象的默认原型是什么,是 Object 吗?对于一个函数对象也是这样吗?最后,
F
被实例化并返回,成为我们的newObject
。这里new
操作符是否必要?F
已经提供了我们需要的内容,或者说函数对象和非函数对象之间有一个关键区别吗?显然,无法使用此技术来构造构造函数。
下一次调用 Object.create()
会发生什么?全局函数 F
会被覆盖吗?肯定不会被重用,因为这会改变先前配置的对象。如果多个线程调用 Object.create()
,是否存在一种同步机制来防止在 F
上发生竞态条件?
F.prototype
。同时,所有新对象都将 F 作为它们的.constructor
。因此,在任何给定时间,它们可能具有许多不同的原型,但它们的.constructor.prototype
都将是最新的原型塞入 F 中。 - FutureNerd