gpt4 book ai didi

Javascript 继承重写

转载 作者:行者123 更新时间:2023-12-02 16:11:13 26 4
gpt4 key购买 nike

网上有很多关于 Javascript 重写的令人困惑的文献。但是,我还没有找到一个可以满足我需要的。我正在尝试启用继承和方法重写,但以特定的方式。

想象一下:

var A = function(amount) {
this.amount = amount;
var _this = this;

this.method1 = function() {
some_asynchronous_function(this.amount, function(result) {
_this.method2(result);
});
};
//The function we want to override!
this.method2 = function(result) {
do_stuff(result);
};
};

var B = function(amount) {
this.method2 = function(result) {
do_different_stuff(result);
};
A.call(this, amount);
};
B.prototype = Object.create(A.prototype);

我的目标是能够保留 A 类中除 this.method2 之外的所有内容。但是,当我在代码中实例化 B 并调用 B.method1 时,它会执行 A 中的 method2。有没有办法将我保留的内容与 Javascript 混合搭配?

最佳答案

这说明了您问题的本质:

var A = function() {
this.m1 = function(){ console.log('hi from m1 from A'); };
this.m2 = function(){ console.log('hi from m2 from A'); };
};

var B = function() {
this.m2 = function(){ console.log('hi from m2 from B'); };
A.call(this); //try swapping this with the previous line
};
(new B()).m2();

您在构造函数中将方法定义为实例属性。由于您要让 A 构造函数在 m2 定义之后运行,并且构造函数有自己的 m2 定义,因此它将覆盖该定义在它之前。

此处没有生效的原型(prototype)。

但是,您应该为此使用原型(prototype)。如果您将这些方法定义为实例属性,则它们将通过每个 new 单独为每个实例重新定义。

如果将这些方法定义移至原型(prototype),代码将被重用:

var A = function() {

};
A.prototype.m1 = function(){ console.log('hi from m1 from A'); };
A.prototype.m2 = function(){ console.log('hi from m2 from A'); };

var B = function() {
A.call(this);
};
B.prototype = Object.create(A.prototype);
B.prototype.m2 = function(){ console.log('hi from m2 from B'); };

(new B()).m2();
(new B()).m1();

之后,原型(prototype)继承就非常简单了:

  • 实例方法/属性覆盖它们的原型(prototype)祖先
  • 在原型(prototype)中找到的属性会覆盖在原型(prototype)的原型(prototype)中找到的属性(等等)
  • 所有写入都会写入实例(instance.attr = 42 不会覆盖原型(prototype)中的 attr,而是会在 instance 上创建新的 attr 属性)<

关于Javascript 继承重写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30157125/

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