在函数内部或外部为原型分配方法之间的区别

时间:2013-08-23 13:59:46

标签: javascript

我有一个充当基类的函数,我想为它添加方法。我可以通过名称(在函数外部)添加方法到函数的原型,或者不引用函数的名称(在函数内部):

1)参考名称

Base.prototype.getResult = function () {
            return 5;
        }

2)不要引用名称

function Base() {
    this.constructor.prototype.getResult = function () {
        return 5;
    }
}

我很好奇这两种方法之间有什么区别(含义是什么)?

编辑: 更新了我的问题以包含 Jacob Krall 建议的示例: 这意味着Base.prototype.getResult将被定义,直到构造第一个Base对象为止(例如,您不能使用Base.getResult.apply(this)在不同类型的对象上调用它,直到第一个Base对象已创建

function Base() {
    this.constructor.prototype.getResult3 = function () {
        return alert(this.variable);
    }
}

Base.prototype.getResult2 = function () {
    return alert(this.variable);
}

var o = {
    "variable":5
};

Base.prototype.getResult2.call(o); //works
try {
    Base.prototype.getResult3.call(o); //doesn't work
} catch(e) {
    alert('exception is catched');
}

var base = new Base();
base.getResult3.call(o); //works

2 个答案:

答案 0 :(得分:2)

在第一个示例中,您在每个getResult对象的原型上设置Base。这发生在程序执行开始时,很容易推理。我建议这样做。

在第二个示例中,每次构建getResult时,都会在每个Base对象的原型上设置new Base()

这意味着Base.prototype.getResult将为undefined,直到构造第一个Base对象为止(例如,您不能使用Base.getResult.apply(this)在不同类型的对象上调用它直到第一个Base对象被创建之后,这很奇怪)。其次,这样做是浪费的,因为每次调用构造函数时都会创建一个新的Function并将其分配给Base.prototype.getResult

答案 1 :(得分:1)

如果将它们添加到原型中,它们将被初始化一次并在所有实例之间共享。这将节省CPU和内存,可以轻松地为所有现有实例更改它并具有继承性(其中instanceOf为true,因为Parent.call(this)不会)。

每次创建实例时重新启动原型或部分原型都没有多大意义。

原型的作用以及构造函数体或原型中用this.someProp定义的属性之间的差异被解释为here