假设我有一个Javascript类:
function GeneralClass(a, b, c) { ... }
它构造如下:
var g = new GeneralClass(a, b, c);
我想创建一个SpecificClass,它与GeneralClass完全相同,但是带有绑定值,a = 1和c = 3.
我想像这样构建这个类:
var s = new SpecificClass(b);
在其他语言中,有几种方法可以做到这一点:
但是我正在寻找一种更简洁,更优雅的Javascript方式 - 这种方式可以让我在运行中创建许多不同的SpecificClass。
答案 0 :(得分:2)
您可以创建Specific
函数,创建带有绑定参数的GeneralClass
。
function GeneralClass(a, b, c) { ... }
function Specific(b) {
var a = 1, c = 3;
return new GeneralClass(a, b, c);
}
var s = Specific(2);
答案 1 :(得分:0)
这样的事情:jsfiddle
function GeneralClass (a, b, c) {
this.a = a;
this.b = b;
this.c = c;
}
GeneralClass.prototype.hello = function () {
console.log("hello");
console.log(this.a);
console.log(this.b);
console.log(this.c);
}
var g = new GeneralClass(1, 2, 3);
g.hello();
function SpecificClass (b) {
this.a = 1;
this.b = b;
this.c = 3;
}
SpecificClass.prototype = new GeneralClass();
SpecificClass.prototype.bye = function () {
console.log("bye");
console.log(this.b);
}
var s = new SpecificClass(22);
s.hello();
s.bye();
答案 2 :(得分:0)
好的,我认为以上解决方案可行。但是,有一个问题。每次需要扩展GeneralClass时,都必须创建一个新函数。这是我的建议。它是一个返回函数的函数。它接受你想要的任意数量的参数,如果它们中的一些是 null ,它稍后会被传递给新创建的函数的参数替换。
var GeneralClass = function(a, b, c) {
console.log(a, b, c);
}
var GeneralClassExtender = function() {
var defaults = [];
for(var i=0; i<arguments.length; i++) {
defaults.push(arguments[i]);
}
return function() {
var argsToApply = [];
for(var i=0, usedArguments=0; i<defaults.length; i++) {
if(defaults[i] === null) {
argsToApply.push(arguments[usedArguments]);
usedArguments += 1;
} else {
argsToApply.push(defaults[i]);
}
}
return GeneralClass.apply({}, argsToApply);
}
}
var SpecificClass = GeneralClassExtender(1, null, 3);
var AnotherClass = GeneralClassExtender(null, 99, null);
var obj1 = new SpecificClass(10);
var obj2 = new AnotherClass(6, 20);
此脚本的结果是
1 10 3
6 99 20
这是一个jsfiddle http://jsfiddle.net/krasimir/bAGVD/3/