gpt4 book ai didi

javascript - 为什么使用 'prototype' 进行 javascript 继承?

转载 作者:数据小太阳 更新时间:2023-10-29 04:49:53 25 4
gpt4 key购买 nike

JavaScript 对象具有“原型(prototype)”成员以促进继承。但似乎,即使没有它,我们也可以过得很好,我想知道使用它有什么好处。我想知道有什么优点和缺点。

例如,考虑以下内容(此处为 jsfiddle ):

function Base (name) {

this.name = name;
this.modules = [];
return this;
}

Base.prototype =
{
initModule: function() {
// init on all the modules.
for (var i = 0; i < this.modules.length; i++)
this.modules[i].initModule();
console.log("base initModule");
}
};

function Derived(name) {
Base.call(this,name); // call base constructor with Derived context
}

Derived.prototype = Object.create(Base.prototype);

Derived.prototype.initModule = function () {
console.log("d init module");
// calling base class functionality
Base.prototype.initModule.call(this);
}

var derived = new Derived("dname");
console.log(derived.name);
derived.initModule();

问题是,为什么要使用“原型(prototype)”?我们也可以做一些像 Derived = Object.create(Base);

例如(jsfiddle):

Base =
{
initModule: function() {
// init on all the modules.
for (var i = 0; i < this.modules.length; i++)
this.modules[i].initModule();
console.log("base initModule",this.name);
},
init: function(name) {
this.name = name;
this.modules = [];
}
};

Derived = Object.create(Base);

Derived.initModule = function () {
console.log("d init module");
// calling base class functionality
Base.initModule.call(this);
}
Derived.init("dname");
console.log(Derived.name);
Derived.initModule();

最佳答案

如果不使用原型(prototype),每个类都会重新定义方法。也就是说,new Base;新基地; new Base 将在第二个示例中创建六个 函数。这需要更多的时间和空间。 Derived 也将创建自己的函数。

此外,您不能使用原型(prototype)来动态更改每个实例的方法(或添加新方法),这可能会有帮助——尤其是跨模块。

但这并不是说您应该始终为每个方法使用原型(prototype)。每种情况都不同。

prototype 还允许您在不同的上下文中调用方法而无需创建实例(如 Array.prototype.forEach.call 在类数组上的情况)对象)。

关于javascript - 为什么使用 'prototype' 进行 javascript 继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15276085/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com