只有3行代码,但我很难完全掌握这个:
Object.create = function (o) {
function F() {}
F.prototype = o;
return new F();
};
newObject = Object.create(oldObject);
Run Code Online (Sandbox Code Playgroud)
Object.create()通过创建一个名为的空函数开始F.我认为函数是一种对象.这个F对象存放在哪里?在全球范围内我猜.
接下来,我们oldObject传入o,成为功能的原型F.函数(即对象)F现在从我们"继承" oldObject,在名称解析将通过它的路上.很好,但我很好奇默认原型是什么对象,对象?这对于函数对象也是如此吗?
最后,F实例化并返回,成为我们的newObject.new这里的操作是否必要?还没有F提供我们需要的东西,或者功能对象和非功能对象之间是否存在重要区别?显然,使用这种技术不可能有一个构造函数.
下次Object.create()调用会发生什么?全局功能F被覆盖了吗?当然它不会被重用,因为这会改变以前配置的对象.如果多个线程调用会发生什么Object.create(),是否有任何类型的同步来防止竞争条件F?
我在Pro JavaScript设计模式中理解这个函数末尾的IF子句时遇到了一些麻烦:
function extend(subClass, superClass) {
var F = function() {};
F.prototype = superClass.prototype;
subClass.prototype = new F();
subClass.prototype.constructor = subClass;
subClass.superclass = superClass.prototype;
if(superClass.prototype.constructor == Object.prototype.constructor) {
superClass.prototype.constructor = superClass;
}
}
Run Code Online (Sandbox Code Playgroud)
本书解释说,这些行确保正确设置超类的构造函数属性,即使超类是Object类本身也是如此.但是,如果我省略这三行并执行以下操作:
function SubClass() {};
extend(SubClass, Object);
alert(Object.prototype.constructor == Object);
Run Code Online (Sandbox Code Playgroud)
警报显示'true',这意味着即使没有最后三行,超类的构造函数也会正确设置.那么,在什么条件下,这个IF语句是否有用呢?
谢谢.