1

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

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
4

2 回答 2

3

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

在第二个示例中,每次构造a 时都设置每个对象getResult的原型。Basenew Base()

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

于 2013-08-23T14:22:56.690 回答
1

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

每次创建实例时重新启动原型或其中的一部分并没有多大意义。

这里this.someProp解释了原型的作用以及在构造函数主体或原型上定义的属性之间的区别。

于 2013-08-23T14:14:13.170 回答