相关疑难解决方法(0)

Crockford的对象创建技术发生了什么?

只有3行代码,但我很难完全掌握这个:

Object.create = function (o) {
    function F() {}
    F.prototype = o;
    return new F();
};
newObject = Object.create(oldObject);
Run Code Online (Sandbox Code Playgroud)

(来自Prototypal Inheritance)

  1. Object.create()通过创建一个名为的空函数开始F.我认为函数是一种对象.这个F对象存放在哪里?在全球范围内我猜.

  2. 接下来,我们oldObject传入o,成为功能的原型F.函数(即对象)F现在从我们"继承" oldObject,在名称解析将通过它的路上.很好,但我很好奇默认原型是什么对象,对象?这对于函数对象也是如此吗?

  3. 最后,F实例化并返回,成为我们的newObject.new这里的操作是否必要?还没有F提供我们需要的东西,或者功能对象和非功能对象之间是否存在重要区别?显然,使用这种技术不可能有一个构造函数.

下次Object.create()调用会发生什么?全局功能F被覆盖了吗?当然它不会被重用,因为这会改变以前配置的对象.如果多个线程调用会发生什么Object.create(),是否有任何类型的同步来防止竞争条件F

javascript creation object prototypal-inheritance

25
推荐指数
2
解决办法
6096
查看次数

JavaScript继承扩展功能

我在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语句是否有用呢?

谢谢.

javascript

11
推荐指数
1
解决办法
2万
查看次数