2010-05-04 90 views
1

我見過以兩種不同的方式定義的對象,它們的功能類似,但當然是根本不同的。你可以做到這一點無論是這樣的:哪種創建javascript對象的方法更好?

var myobject = {property: 'hello', 
       act: function() { 
        this.property += ' world'; 
       }}; 

像這樣:

function myobject() { 
    this.property = 'hello'; 
    this.act = function() { 
     this.property += 'world'; 
    } 
} 

第二種方法可以像這樣

var newobj = new myobject(); 

,但你可以做類似的使用第一的東西創建對象通過使該對象成爲函數的返回值來表示符號。 new關鍵字具有能夠傳遞可用於初始化對象屬性的參數的優點,但您可以輕鬆地將init函數添加到第一種對象。

只是想知道除了這兩個區別之外,如果有一個根本的區別,那就是使得一種方法明顯優於另一種方法。

+1

有很多差異,沒有人同意一種方法更好。背景:http:// stackoverflow。com/questions/1595611 /如何正確地創建一個自定義對象的javascript – bobince 2010-05-04 02:50:45

回答

2

第二個更好,因爲你可以重複使用它。此外,構造對象的constructor屬性在每種情況下都不相同。

除此之外,第二種方法通過每次調用構造函數時向act屬性分配一個新函數來浪費空間。 (注意,第一方法也浪費以同樣的方式的空間。)使用原型代替:

function MyConstructor() { 
    this.property = 'hello'; 
} 

MyConstructor.prototype = { 
    act: function() { 
    this.property += 'world'; 
    } 
}; 

MyConstructor.prototype.constructor = MyConstructor; 

var obj = new MyConstructor(); 
+0

您可以重複使用第一種方法不超過或少於第二種方法。唯一的區別是第一個必須在它被調用或執行之前被聲明。 – 2010-05-04 03:57:07

0
var f = function() {}; 
function g() {} 

if (typeof(f) === typeof(g)) { 
    alert(typeof(f) + "\n" + f + "\n" + g); 
} 

的類型是相同的和變量f具有分配給它一個匿名函數。由於f是一個具有函數作爲其值的命名變量,因此它是一個非匿名函數。 JavaScript是向下繼承的lambda語言,允許意外創建全局變量。關於在方差名稱空間範圍內使用閉包的複雜繼承實例,您必須確定變量的定義位置以防止衝突,尤其是考慮重用。第一個約定強制變量聲明的嚴格意識,因爲該函數必須在可執行之前聲明。第二個約定不提供這種意識,這在實例化和調用方面可能存在問題,因爲之前描述的複雜邏輯中的關閉是封閉的。幸運的是,在聲明一個函數之前,JSLint足夠聰明,可以拋出一個錯誤。由於這兩個公約在代表性上是相同的,所以我建議只使用那些不適用於有缺陷和潦草程序的濫用公約。

總之,如果g和f都是帶有作爲賦值函數的命名變量,那麼總是使用第一個約定,使用var關鍵字聲明變量。

0
javascript: 
    canDo="b:c=function(){}"; 
    canNot="function a:d(){}"; 

    eval(canDo); 

    alert(["Can do ",canDo, 
     ".\n\n\nConfirmed result is: \n\n b:c=", 
     eval("b:c") 
     ].join("")); 

    alert(
    confirm(
     "Click OK to confirm this is not valid (can NOT do):\n\n" + canNot) ? 
    eval(canNot) : "Test will fail if attempted and 'a:d' will not exist." 
); 

顯示器,在FireFox:

 
Can do b:c=function(){}. 


Confirmed result is: 

b:c=function() { 
} 

 
Click OK to confirm this is not valid (can NOT do): 

function a:d(){} 

如果選擇OK這給運行時錯誤。

相關問題