-3

像这样的代码:

var Policy={
    initialize:function(){
        return function(){
               this.initialize.apply(this,arguments);
        };
    }
};
var AjaxLoadingPolicy= Policy.initialize();//(1)
AjaxLoadingPolicy.prototype={
    initialize:function(name){
        this.name=name;
    }
};

基于此代码,AjaxLoadingPolicy 是 (1) 中带有 this.initialize.apply(this,arguments) 的函数。但我真的不明白 this.initialize 是什么。以及为什么可以在 AjaxLoadingPolicy.prototype 中定义它?另外,apply 不是用于将超类优先级应用于实例吗?

4

1 回答 1

1

在代码中的 (1) 处,为AjaxLoadingPolecy的值分配了对具有主体的新函数对象的引用:

function(){
    this.initialize.apply(this,arguments);
}; 

何时调用该函数的值this只能通过查看它的调用方式来确定。如果它被简单地调用,AjaxLoadingPolecy()那么this将引用全局对象(或在严格模式下未定义)。

分配给的对象AjaxLoadingPolecy.prototype有一个由AjaxLoadingPolecy的实例(即由创建的对象)继承的initialize方法,它不是由AjaxLoadingPolecy本身继承的。new AjaxLoadingPolecy()

对象继承自其构造函数的公共原型(称为实例的内部[[Prototype]]),而不是它们自己的公共原型。

顺便说一句,在 OP 中,以下内容:

AjaxLoadingPolicy.prototype={
    initialize:function(name){
        this.name=name;
    }
};

与以下内容完全相同:

AjaxLoadingPolicy.prototype.initialize = function(name) {
    this.name=name;
};

第二个使用现有的原型对象,而前者替换它(使用更多代码并浪费对象的实例化)。

apply用于设置函数this和提供参数。Javascript 没有类(或超类),但apply可能call会在模拟该行为时使用。

于 2012-07-20T06:17:15.440 回答