在javascript中使用此功能

时间:2012-07-20 04:57:05

标签: javascript javascript-objects

像这样的代码:

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)的函数。但我真的不明白th​​is.initialize是什么。以及为什么可以在AjaxLoadingPolicy.prototype中定义它?此外,是否使用apply来将超类优先级应用于实例?

1 个答案:

答案 0 :(得分:1)

在代码中的(1)处, AjaxLoadingPolecy 的值被赋予对具有正文的新函数对象的引用:

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

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

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

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

顺便提一下,在OP中,有以下内容:

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

与:

完全相同
AjaxLoadingPolicy.prototype.initialize = function(name) {
    this.name=name;
};

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

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