2

我试图理解 Mozilla 在构造函数链上发布的一些代码。我已经对我认为我理解的部分添加了评论,但我仍然不清楚这里发生的一切。有人可以逐行解释这段代码中发生了什么吗?

// Using apply() to chain constructors.
Function.prototype.construct = function (aArgs) {

    // What is this line of code doing?
    var fConstructor = this, fNewConstr = function () { fConstructor.apply(this, aArgs); };

    // Assign the function prototype to the new function constructor's prototype.
    fNewConstr.prototype = fConstructor.prototype;

    // Return the new function constructor.
    return new fNewConstr();
};

// Example usage.
function MyConstructor () {

    // Iterate through the arguments passed into the constructor and add them as properties.
    for (var nProp = 0; nProp < arguments.length; nProp++) {
        this["property" + nProp] = arguments[nProp];
    }
}

var myArray = [4, "Hello world!", false];
var myInstance = MyConstructor.construct(myArray);

// alerts "Hello world!"
alert(myInstance.property1); 

// alerts "true"
alert(myInstance instanceof MyConstructor); 

// alerts "MyConstructor"
alert(myInstance.constructor); 

原始代码可以在这里找到。

4

1 回答 1

2

基本上,这是调用构造函数的另一种方法,它使您有机会将构造函数调用包装在另一个函数中。我将专注于您感到困惑的那条线。 fConstructor设置为this,它引用了我们原来的构造函数,在这个例子中是MyConstructorfNewConstr是将覆盖原始构造函数的构造函数。在其中,fNewConstr您可以实现在MyConstructor. 在fNewConstr中,我们fConstructor使用 Function apply方法调用,this作为上下文传递,并将aArgs数组传递给构造方法。然后我们将原型设置fNewConstrfConstructor原型完成继承链。最后,我们返回一个新的实例fNewConstr。在函数调用前加上 new 关键字会创建一个新对象,将其原型设置为函数的原型,并在新项的上下文中调用函数。因为我们将fConstructor方法应用到fNewConstr的上下文中,所以结果与调用 基本相同new MyConstructor()。说得通?或者我需要更详细地介绍。

于 2012-10-17T21:05:31.387 回答