感谢stackoverflow海报的帮助我已经设置了一些oop javascript。但是,我遇到了另一个问题。
我有两个具有相同继承的不同类。然后他们都有一个名为相同的功能,但做了不同的事情。麻烦的是,如果最后定义了ClassB,那么即使我有一个ClassA对象,也要编写classAInstance.MyFunction();它返回2,即ClassB的同名函数。
BaseClass = function(){
...init some stuff...
};
ClassA = function(){
BaseClass.call(this);
...init some stuff...
};
ClassA.prototype = BaseClass.prototype; // innherit
ClassA.prototype.MyFunction(){
return 1;
};
ClassB = function(){
BaseClass.call(this);
...init some stuff...
};
ClassB.prototype = BaseClass.prototype; // innherit
ClassB.prototype.MyFunction(){
return 2;
}
答案 0 :(得分:3)
原因是因为ClassA和ClassB的原型都指向同一个对象。我不确定你的用例是什么,但将原型作为实例也是如此。
ClassA.prototype = new BaseClass();
...
ClassB.prototype = new BaseClass();
答案 1 :(得分:2)
你的问题是对象是通过引用而不是值传递的!
(实际上,从技术上来说,它是按值计算的,但为了论证,这个值是一个参考)。
关键是,当您设置ClassA.prototype.myFunction时,您正在BaseClass的原型上定义一个新函数,因为请记住ClassA.prototype = BaseClass.prototype。
那么,当您设置ClassB.prototype.myFunction时,您将再次覆盖BaseClass.prototype.myFunction,然后再覆盖ClassA的函数!
答案 2 :(得分:0)
在JS中有许多方法可以执行继承。您遇到的问题是所有三个类实际上是相同的,因为它们 all 引用BaseClass.prototype
处的对象。
从简单基类继承的一种简短方法是使用:
ClassA.prototype = new BaseClass();
和
ClassB.prototype = new BaseClass();
对于构造函数来说,对于更高级的类(即涉及参数的类),这将会分崩离析。我记得道格拉斯·克罗克福德有一个功能可以用来做一个更好的延伸版本,但是我现在无法找到它。
答案 3 :(得分:0)
您正在错误地设置新类的原型
BaseClass = function(){
...init some stuff...
};
ClassA = function(){
BaseClass.call(this);
...init some stuff...
};
ClassA.prototype = new BaseClass(); // innherit
ClassA.prototype.MyFunction(){
return 1;
};
ClassB = function(){
BaseClass.call(this);
...init some stuff...
};
ClassB.prototype = new BaseClass(); // innherit
ClassB.prototype.MyFunction(){
return 2;
};
答案 4 :(得分:-1)
通常,您不希望在任何嵌套或相互继承的对象网络中拥有两个具有相同名称的函数。为什么不将第二个MyFunction(){
重命名为其他内容?