JavaScript 继承 : when constructor has arguments

标签 javascript inheritance prototype-programming

使用纯JavaScript做继承,我通常是这样的:

function A() {}
A.prototype.run = function () {};

function B() {}
B.prototype = new A;
B.prototype.constructor = B;

由于没有参数传递给构造函数,new A 没有什么可提示的。现在,如果构造函数有要传递的参数,我还没有想出一个很好的继承方法。例如,

function A(x, y) {}
A.prototype.run = function () {};

function B(x, y) {}
B.prototype = new A;
B.prototype.constructor = B;

我可以传递一些任意值,例如:

B.prototype = new A(null, null);

在某些情况下,我可能需要在 A 的构造函数中验证 x 和 y。在某些极端情况下,我需要在检查 x 或 y 时抛出错误。那么,B 就没有办法使用新的 A 从 A 继承。

有什么建议吗?

谢谢!

最佳答案

好吧,如果你想让 B.prototype 成为继承自 A.prototype 的对象,而不执行 A 构造函数,避免所有可能的副作用,你可以使用一个虚拟构造函数来做到这一点,例如:

function tmp() {}
tmp.prototype = A.prototype;
B.prototype = new tmp();
B.prototype.constructor = B;

您可以创建一个函数来封装创建这个新对象的逻辑,例如:

function inherit(o) {
  function F() {}; // Dummy constructor
  F.prototype = o; 
  return new F(); 
}

//...
B.prototype = inherit(A.prototype);
B.prototype.constructor = B;

如果您的目标是现代浏览器,您可以使用 ECMAScript 5 Object.create 方法来达到同样的目的,例如:

B.prototype = Object.create(A.prototype);
B.prototype.constructor = B;
//..

关于JavaScript 继承 : when constructor has arguments,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7533473/

相关文章:

javascript - 在AngularJS中,如何确定组件是否提供了属性?

javascript - 在页面加载时使用 Jquery 加载栏

c++ - 派生类的成员函数

javascript - 灯箱中的可见性按钮

java - 使用内部类进行子类化,仅序列化外部类

java - 使用 "this"意味着 "super"使用字段可以吗

javascript - 构造函数中的方法与函数原型(prototype)属性之间的区别

javascript - 在原型(prototype)属性上使用 ng-model,无法编辑输入字段

javascript - 属于 JavaScript 对象原型(prototype)的回调函数可以访问对象成员吗?

javascript - jquery :last-child did not work properly