1

假设我有一个 Javascript 类:

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

它是这样构造的:

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

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

我想像这样构造这个类:

var s = new SpecificClass(b);

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

  • 我可以让SpecificClass继承GeneralClass,并让SpecificClass的构造函数调用GeneralClass的构造函数,并分配我想要的赋值。
  • 我可以在 SpecificClass 中添加一个 GeneralClass 字段,并将所有方法调用委托给它。

但我正在寻找一种更短、更优雅的方式在 Javascript 中执行此操作 - 一种使我能够即时创建许多不同的 SpecificClass 的方式。

4

3 回答 3

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);
于 2013-08-26T07:06:39.430 回答
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/

于 2013-08-26T07:57:16.370 回答
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();
于 2013-08-26T07:35:54.340 回答