1

Javascript クラスがあるとします。

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

次のように構成されています。

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

これは 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

わかりました、上記の解決策がうまくいくと思います。ただし、1 つ問題があります。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 に答える