我正在创建一个框架来简化面向对象编码的原型。但我正在思考JavaScript中的继承。
默认情况下,为了扩展对象,我们写:
var B = function() { /*...*/ } ;
B.prototype = new A() ;
但 A 构造函数需要参数吗?
var A = function(args) {
if (!args) throw "Arguments required." ;
} ;
或者 构造函数也可以在 B 实例化之前执行不需要的操作。
您建议更换默认继承行为? (我考虑过将所有“类”的所有成员存储起来,以便在继承或混合时进行复制。)
答案 0 :(得分:3)
如果你想在不调用构造函数的情况下从原型继承,你可以使用Object.create()
做这样的事情:
var B = function() { /*...*/ };
B.prototype = Object.create(A.prototype);
B.prototype.constructor = B;
在上文中,Object.create(A.prototype)
将返回一个新对象,其原型由A.prototype
提供,并且在不调用A()
的情况下执行此操作。第二行是那里你可以在B的任何实例上查找构造函数属性,它将指向B()
。
需要注意的一点是Object.create()
相对较新,因此您可能需要为旧版浏览器添加填充功能。你可以在这里找到一个,以及更多信息:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create
答案 1 :(得分:1)
我通常使用defclass
实用程序函数在JavaScript中定义“类”:
function defclass(base, body) {
var uber = base.prototype;
var prototype = Object.create(uber);
var constructor = (body.call(prototype, uber), prototype.constructor);
constructor.prototype = prototype;
return constructor;
}
然后我按如下方式使用它:
var A = defclass(Object, function () {
this.constructor: function (arg1, arg2) {
this.arg1 = arg1;
this.arg2 = arg2;
}
this.log = function (which) {
console.log(which ? this.arg1 : this.arg2);
};
});
继承很简单:
var B = defclass(A, function (uber) {
this.constructor = function (arg1, arg2, arg3) {
uber.constructor.call(this, arg1, arg2);
this.arg3 = arg3;
};
this.log = function (which) {
uber.log.call(this, which);
console.log(this.arg3);
};
});
正如您在我们扩展“课程”时所看到的,我们使用Object.create
。这是一种新的继承方式。使用new
已过时。在B
的构造函数中,我们使用A
将参数传递给uber.constructor.call
的构造函数。
如果你喜欢这种模式,那么你应该看一下augment库。