gpt4 book ai didi

javascript - 在Javascript中扩展继承的原型(prototype)方法

转载 作者:行者123 更新时间:2023-11-27 23:07:07 25 4
gpt4 key购买 nike

我有一些与“父子”相关的类(构造函数):

// Abstract root SuperClass

function SuperClass() {
this.CLASS_ID = "SUPER-CLASS";
throw new Error('Failed to instantiate abstract class' + this.CLASS_ID);
}

SuperClass.prototype.sayHello = function() {
alert('Hello, world!');
};

// Absctract ClassA inherits from SuperClass
// inherit() and extend() are generic functions from the David Flanagan`s
// brilliand book "Definitive Guide"

function ClassA() {
this.CLASS_ID = "CLASS-A";
throw new Error('Failed to instantiate abstract class' + this.CLASS_ID);
}

ClassA.prototype = inherit(SuperClass.prototype);

// Concrete ClassB inherits from ClassA

function ClassB(initData) {
this.CLASS_ID = "CLASS-B";
}

ClassB.prototype = inherit(ClassA.prototype);

extend(ClassB.prototype, {
constructor: ClassB,

welcomeNewDay: function() {
this.sayHello();
this.doSomethingElse();
},

doSomethingElse: function(){
alert('Jumping');
}
});

var classB = new ClassB();
classB.welcomeNewDay();

如何正确扩展抽象 ClassA 的方法 .sayHello() 而不重载它?

我尝试这样做:

extend(ClassA.prototype, {
sayHello: function() {
this.__proto__.sayHello();
this.sing();
},

sing: function() {
alert('Lalala');
}
});

问题在于 .sing() 被调用了 3 次,而不是 1 次。

如果我尝试:

this.__proto__.sayHello.call(this);

它抛出异常:

Uncaught RangeError: Maximum call stack size exceeded

最佳答案

尝试访问初始类:

extend(ClassA.prototype, {
sayHello: function() {
SuperClass.prototype.sayHello.call(this);
this.sing();
},

sing: function() {
alert('Lalala');
}
});

或者只存储当前的 sayHello() 方法:

var initialSayHello = ClassA.prototype.sayHello;
extend(ClassA.prototype, {
sayHello: function() {
initialSayHello.call(this);
this.sing();
},

sing: function() {
alert('Lalala');
}
});

您需要引用原始 sayHello() 方法。

<小时/>

Uncaught RangeError: Maximum call stack size exceeded

它被抛出是因为你实际上有一个无限递归,在方法中调用方法本身。

关于javascript - 在Javascript中扩展继承的原型(prototype)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36493161/

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