1

純粋なコンストラクター関数があるとします (this.Bar = bar 以外は何も含まれていません)。

1) 別の関数から呼び出す場合、呼び出すときに呼び出し元関数の引数を直接渡すことができvar myBar=new bar, myBar.Bar=thebarますか?

2) すべての引数を取得しなくても、コンストラクターはインスタンス化されますか?

3) 引数の 1 つが一意であるかどうかを確認するにはどうすればよいですか。つまり、オブジェクトの他のインスタンスが問題のプロパティに対してこの値を持っていませんか? 具体的には、作成時に各オブジェクトに一意のインデックスを割り当てたいと考えています。もしかして配列?

よろしくお願いします

4

2 に答える 2

3

純粋なコンストラクター関数があるとします (this.Bar = bar 以外は何も含まれていません)。

私はあなたが意味すると仮定するつもりです:

function MyConstructor(bar) {
    this.Bar = bar;
}

(注: JavaScript で圧倒的に多いのは、プロパティ名は小文字で始まるという慣例です。したがってthis.bar、ではありませんthis.Bar。最初にキャップされた識別子は通常、コンストラクター関数用に予約されています。)

1) 別の関数から呼び出す場合、呼び出すときに呼び出し元関数の引数を直接渡すことができますか、それとも var myBar=new bar, myBar.Bar=thebar を実行する必要がありますか?ここで、バーは呼び出し元引数です?

それらを直接渡すことができます:

function foo(a, b, c) {
    var obj = new MyConstructor(b);
}

2) すべての引数を取得しなくても、コンストラクターはインスタンス化されますか?

渡された引数の数は、JavaScript エンジンによってチェックされません。渡さない仮引数はundefined、関数が呼び出されたときに値を持ちます。

function MyConstructor(bar) {
    console.log(bar);
}
var obj = new MyConstructor(); // logs "undefined"

3) 引数の 1 つが一意であるかどうかを確認するにはどうすればよいですか。つまり、オブジェクトの他のインスタンスが問題のプロパティに対してこの値を持っていませんか? 具体的には、作成時に各オブジェクトに一意のインデックスを割り当てたいと考えています。もしかして配列?

通常、これはコンストラクターのスコープ内ではありません。しかし、はい、配列またはオブジェクトを使用してそれを行うことができます。

var knownBars = [];
function MyConstructor(bar) {
    if (knownBars.indexOf(bar) !== -1) {
        // This bar is known
    }
    else {
        // Remember this bar
        knownBars.push(bar);
    }
}

もちろん、indexOf検索に必要なものではない可能性があるため、他の方法Array.prototypeまたは独自のループを使用する必要がある場合があります。

もう 1 つの方法は、オブジェクトを使用することです。barこれは、それが文字列または文字列に変換できるものであると仮定しています。

var knownBars = {};
function MyConstructor(bar) {
    if (knownBars.indexOf(bar) !== -1) {
        // This bar is known
    }
    else {
        // Remember this bar
        knownBars[bar] = 1;
    }
}
于 2012-05-29T16:21:07.010 に答える
1

別の関数から呼び出す場合、呼び出し元の関数の引数を直接渡すことはできますか?

this.Bar = barできない場合、コンストラクター関数を使用してもあまり意味がありません。

すべての引数を取得しなくても、コンストラクターはインスタンス化されますか?

その中に何もないと仮定すると、引数が欠落している場合、はい、例外がスローされます。引数は の値を取得しますundefined

引数の 1 つが一意であるかどうかを確認するにはどうすればよいですか。つまり、オブジェクトの他のインスタンスには、問題のプロパティに対してこの値がありませんか?

チェックするそれらの共有ストアが必要です。

例えば:

var Constructor = (function () {
    var unique_check_store = {};
    function RealConstructor(bar) {
        if (typeof bar == 'undefined') {
            throw "You must specify bar";   
        }
        if (unique_check_store.hasOwnProperty(bar)) {
            throw "You have already created one of these called '" + bar + "'";
        }
        this.Bar = bar;
        unique_check_store[bar] = true;
    }
    return RealConstructor;
})();

var a, b, c;
try {
    a = new Constructor();    
} catch (e) {
    alert(e);
}
try {
    b = new Constructor("thing");    
} catch (e) {
    alert(e);
}
try {
    c = new Constructor("thing");    
} catch (e) {
    alert(e);
}
alert(a);
alert(b);
alert(c);


​
于 2012-05-29T16:19:32.780 に答える