0

What is the difference between below approaches for adding methods to an object:

// 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

Both do the same thing. Besides the different syntax, is one approach preferred over the other? From my point of view, both approaches simply add methods (or function if you like) to an object.

http://jsfiddle.net/NK35z/

​</p>

4

4 回答 4

2

两者在语义上是相同的。对象字面量语法是首选,因为它更清楚您在做什么,并且它还为 JavaScript 引擎提供了优化结果的机会。

于 2012-04-30T04:50:43.447 回答
1

它们完全相同。当您不想覆盖对象上已经存在的属性/方法时,您必须使用点/方括号访问器。

于 2012-04-30T04:52:55.800 回答
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

这两种声明对象/函数的方式没有区别。如果您的意思是“它们不会改变”中的静态方法,那会很好用。

它们不是传统意义上的静态方法。每次创建这样的对象时,它都会在内存中拥有自己独特的表示形式。这意味着您将为该对象的每个实例(函数的 n 个副本)拥有一个函数,而不是内存中的一个函数。

为了制作不需要实例的静态方法(在经典的 OOP 意义上,由类共享的方法(在 JavaScript 中没有类,因此使用相同构造函数/原型的对象)不需要实例),你不能真正做到. 但是,如果您希望函数只占用内存中的一个空间,则必须使用构造函数模式

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 回答