1

オブジェクト指向のJavaScriptを学ぶのに苦労しています。私は次のようなオブジェクトコンストラクターを持っています:

//generic object
function myObject(value1, value2, value3){
this.value1 = value1;
this.value2 = value2;
this.value3 = value3;
this.method1 =method1;
}

function method1(){
alert('hello');
}

function method2(){
alert('hello again');
}

このオブジェクトの新しいインスタンスを次のように作成しています。

instance1 = new myObject(
1, //value1
2, //value2
3  //value3
)

私の問題はこれです:myObjectのいくつかのインスタンスでは、カスタム値とメソッドが必要です。作成時に追加したいと思います。ただし、インスタンス名を再度記述せずにそれを行う方法を理解することはできません。これは、新しいオブジェクトを追加するプロセスが大幅に遅くなるため、回避しようとしています。

このコードを置き換える方法はありますか。

 instance1 = new myObject(
 1, //value1
 2, //value2
 3  //value3
 )
 instance1.method2 =method2;
 instance1.value4 =4;

..「instance1」という名前を繰り返す必要のないもので?

4

3 に答える 3

5

MyObjectで更新関数を作成できますprototype

function MyObject(value1, value2, value3){
    this.value1 = value1;
    this.value2 = value2;
    this.value3 = value3;
    this.method1 =method1;
}

MyObject.prototype.update = function( args ) {
    for(var name in args) {
        this[ name ] = args[ name ];
    }
};

//using it
var instance1 = new MyObject( 1, 2, 3 );
instance1.update( {
    method2: method2,
    value4: 4
});

注意点として、コンストラクター関数の名前をからに変更しmyObjectましたMyObject。JavaScriptでは、コンストラクター関数はキャメルケースではなくパスカルケースの名前であるという規則があります。newこのようにして、開発者がパスカルケースである関数を見ると、キーワードを使用する必要があることがわかります。詳細については、こちらをご覧ください: http: //elegantcode.com/2010/12/21/basic-javascript-part-4-enforcing-new-on-constructor-functions/

また、新しいJS開発者として、AppendTo.comhttp :Learn jQuery and JavaScript //learn.appendto.com/からこの無料シリーズをチェックすることをお勧めします。

于 2012-08-22T01:01:28.437 に答える
2

jQueryを利用できるので、を使用jQuery.extend()して再入力する必要がなくなりinstance1ます。 jQuery.extend()プロパティをあるオブジェクトから別のオブジェクトにコピーします。

jQuery.extend(instance1, {
    method2: method2
    value4: 4
});

これにより、2番目の引数のすべてのプロパティが最初の引数のオブジェクトにコピーされます。詳細については、jQueryのドキュメントを参照してください。


これをコンストラクターの一部として指定したい場合は、次のように指定して、次のように入力するコード行を追加する必要はありません。

function myObject(value1, value2, value3, extraProperties){
    this.value1 = value1;
    this.value2 = value2;
    this.value3 = value3;
    this.method1 = method1;
    if (extraProperties) {
        jQuery.extend(this, extraProperties);
    }
}

その場合は、次のようにコーディングするだけです。

var instance1 = new myObject(1, 2, 3, {method2: method2, value4: 4});

もちろん、これを行うためのよりオブジェクト指向の方法は、必要なオブジェクトのタイプごとにプロトタイプを作成し(一部は他のオブジェクトから継承できます)、インスタンス固有のメソッドとプロパティを追加するのではなく、適切なタイプのオブジェクトをインスタンス化することです。

または、インスタンス固有のメソッドを追加するのではなく、オブジェクトのすべての使用に必要なすべてのメソッド/機能を備えた単一のプロトタイプを作成します。javascriptでは、プロトタイプ上にある場合に時々使用しないオブジェクトにメソッドを設定してもペナルティはありません。プロトタイプの内容はインスタンスごとに無料です(インスタンスごとのストレージ消費、インスタンスごとの初期化コストなどはありません)。

于 2012-08-22T01:06:18.717 に答える
0
function myObject (value1, value2, value3, attributes)
{
    $.extend(this, attributes);
    // the rest of your code
}

// Usage
var obj = new myObject(1,1,1,{ abc: 123, something: "nothing" });

注:これはグローバルではありません。別名、異なる属性値を持つ2つのオブジェクトを作成すると、それぞれに独自のカスタム属性があります。これらの属性を効果的にしたい場合は、すべてのオブジェクトがそのプロトタイプの調整を検討してください。

于 2012-08-22T01:09:03.223 に答える