绑定一个构造函数

假设我有一个Javascript类:

function GeneralClass(a, b, c) { ... } 

它是这样构造的:

 var g = new GeneralClass(a, b, c); 

我想创build一个SpecificClass,它与GeneralClass完全相同,但绑定的值是a = 1和c = 3。

我想要这样构造这个类:

 var s = new SpecificClass(b); 

在其他语言中,有几种方法可以做到这一点:

  • 我可以使SpecificClassinheritanceGeneralClass,并具有GeneralClass的构造函数与我想要的任务调用GeneralClass。
  • 我可以在SpecificClass中添加一个GeneralClass字段,并将所有的方法调用委托给它。

但是我正在寻找一种更简单,更优雅的方法来在Javascript中执行此操作 – 这种方式可以使我在运行中创build许多不同的SpecificClass。

你可以创build一个具有绑定参数的GeneralClassSpecific函数。

 function GeneralClass(a, b, c) { ... } function Specific(b) { var a = 1, c = 3; return new GeneralClass(a, b, c); } var s = Specific(2); 

那么这样的事情呢: 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(); 

好的,我认为上述解决scheme将起作用。 但是,有一个问题。 每次需要扩展GeneralClass时,都必须创build一个新函数。 这是我的build议。 这是一个返回函数的函数。 它接受尽可能多的参数,如果它们中的一些是空的,它将被传递给新创build的函数的参数replace。

 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.net/krasimir/bAGVD/3/