0

オブジェクトにメソッドを追加するための以下のアプローチの違いは何ですか?

// Appending methods to a function using nested functions
var myObj1 = {

    myMethod : function() {
        console.log('myObj1.myMethod was called');
    },

    myOtherMethod : function() {
    },

    myOtherOtherMethod : function() {
    }
}

// Appending methods to a function using the dot operator:
var myObj2 = {};

myObj2.myMethod = function(){
    console.log('myObj2.myMethod was called');
}

myObj2.myOtherMethod = function(){
}

myObj2.myOtherOtherMethod = function(){
}    

myObj1.myMethod(); // myObj1.myMethod was called
myObj2.myMethod(); // myObj2.myMethod was called

どちらも同じことをします。異なる構文に加えて、一方のアプローチが他方よりも優先されますか?私の見解では、どちらのアプローチも、オブジェクトにメソッド(または必要に応じて関数)を追加するだけです。

http://jsfiddle.net/NK35z/

</ p>

4

4 に答える 4

2

この 2 つは意味的に同じです。オブジェクト リテラル構文は、何をしているかがより明確であり、JavaScript エンジンに結果を最適化する機会を与えるため、推奨されます。

于 2012-04-30T04:50:43.447 に答える
1

他の人が言っているように、実際的な違いはありません。オブジェクトリテラルにプロパティを追加することは、すべてを前もって知っていて、値を割り当てることができる場合に意味があります。プロパティを一度に1つずつ追加することは、メソッドを追加する前にいくつかの作業を行う必要がある場合に意味があります。例:

var obj = {
  /* define some stuff here */
};

if ( whatever ) {
  obj.fn = function(){/* logic A */}
} else {
  obj.fn = function(){/* logic B */}
}

正しい方法も間違った方法もありません。それぞれの場合に最適な方法を使用してください。同じオブジェクトに両方を使用してもかまいません。

于 2012-04-30T06:44:30.097 に答える
1

オブジェクト/関数を宣言するこれらの方法に違いはありません。「変わらない」という静的メソッドを意味する場合、それはうまく機能します。

これらは、従来の意味での静的メソッドではありません。そのようなオブジェクトを作成するたびに、メモリ内に独自の表現が作成されます。これは、メモリ内の 1 つの関数の代わりに、そのオブジェクトのインスタンスごとに 1 つの関数 (関数の n コピー) を持つことを意味します。

インスタンスを必要としない静的メソッド (古典的な OOP の意味では、クラス (JavaScript にはクラスがないため、同じコンストラクター/プロトタイプを使用するオブジェクト) によって共有されるメソッド) を作成するために、実際にはそれを行うことはできません。 . ただし、関数がメモリ内の 1 つのスペースのみを占有するようにする場合は、コンストラクター パターンを使用する必要があります。

function Foo()
{
    //we won't assign any properties here.
}

Foo.prototype.method1 = function(var1, var2){
    //don't use `this` here if you want the method to be truly static.
    //static methods shouldn't try and access instance members.
};

Foo.prototype.method2 = function(var2, var3){
   //whatever goes here
};

// Methods on the prototype are shared by all objects of foo, so we can create a new Foo
var f = new Foo();
foo.method1(1,2); // also works.
于 2012-04-30T05:10:01.710 に答える
1

それらはまったく同じです。オブジェクトに既に存在するプロパティ/メソッドを上書きしたくない場合は、ドット/角括弧アクセサーを使用する必要があります。

于 2012-04-30T04:52:55.800 に答える