将方法分配给函数内部或外部原型之间的差异

difference between assigning method to prototype inside or outside the function

本文关键字:之间 原型 外部 分配 方法 函数 内部      更新时间:2023-09-26

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

1) 参考名称

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

2) 请勿引用名称

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

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

编辑:更新了我的问题,包括Jacob Krall对此的建议示例:这意味着在构造第一个Base对象之前,Base.prototype.getResult将是未定义的(例如,在创建第一个Base对象之前,您不能使用Base.getResult.apply(this)在不同类型的对象上调用它

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

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

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

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

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

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

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