JavaScript:以两种不同的方式向对象添加静态方法

时间:2012-04-30 04:43:56

标签: javascript methods

以下为方法添加方法的方法之间有什么区别:

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

4 个答案:

答案 0 :(得分:2)

两者在语义上是相同的。对象文字语法是首选,因为它更清楚你正在做什么,它也为JavaScript引擎提供了优化结果的机会。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

声明对象/功能的两种方式之间没有区别。如果你的意思是“他们不改变”的静态方法,那将会很有效。

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

为了制作静态方法(在经典的OOP意义上,一个类共享的方法(在JavaScript中没有类,所以使用相同的构造函数/原型的对象)不需要实例),你不能真的这样做。但是如果你希望函数只占用内存中的一个空格,你必须使用Constructor Pattern

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.

答案 3 :(得分:1)

正如其他人所说,没有实际的区别。在对象文字中添加属性是有意义的,您可以在前面了解所有内容并且可以只分配值。在添加方法之前,一次添加一个属性是有意义的,例如:

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

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

没有正确或错误的方法,在每种情况下使用最适合的方式。可以将两者用于同一个对象。