2013-04-16 18 views
5

您能否命名與其構造函數名稱相同的實例?你可以命名一個與其構造函數名稱相同的實例嗎?

var myFunc = new function myFunc(){}; 

,因爲它似乎,這替換爲新的實例...這意味着這是一個很好的辛格爾頓函數對象。

我還沒有看到使用這種人,所以我想,也有缺點到這一點,我不知道的......

有什麼想法?

+0

@PeeHaa埽如果你不是一個JS傢伙,不管你是否看起來很奇怪......如果它看起來對JS開發者來說很奇怪,那麼我會更關心 –

+0

其實它確實。因爲我在這裏學習...... – PeeHaa

+0

@PeeHaa埽那麼這是一個教訓? –

回答

1

YES ...

然而,它看起來奇怪,你要創建一個命名的功能,但從來沒有按名稱引用它。

較常見的模式(S)我見過的

function MyClass(){ 
    this.val = 5; 
}; 
MyClass.prototype.getValue = function() { 
    return this.val; 
} 
MyClass = new MyClass(); 

但是,當人們這樣做,我不知道爲什麼他們不只是使用文本對象

var MyClass = { 
    val: 5, 
    getValue: function() { 
     return this.val; 
    } 
} 

,我會甚至更喜歡使用此模塊模式

var MyClass = (function(){ 
    var val = 5; 
    return { 
     getValue: function() { 
      return val; 
     } 
    };  
})(); 

免責聲明

現在Singleton模式是否應使用,這是另一個問題(這個問題的答案是NO,如果你關心的測試,依賴管理性,可維護性,可讀性)

+0

「新功能」的用途是什麼? – PeeHaa

+0

我沒有注意到那部分,那肯定有點奇怪,讓我修復答案 –

+0

如果您嘗試在「MyClass = new MyClass()」之後覆蓋MyClass-> val會發生什麼? –

0

看起來,這代替了功能對象與新實例

不,它不會取代任何東西。一個函數表達式(也就是你有什麼)的名稱只是函數本身內部的訪問,不在外面吧。

var myFunc = new function(){}; 

在一般情況下,如果你不希望某些符號訪問的,只是不要讓他們的全球:因爲如果你省略名稱這將是完全一樣的。定義一個函數裏面那些符號,就回到你想任何訪問,如:

var myobj = (function() { 
    function Foo() {}; 
    // do whatever 
    return new Foo(); 
}()); 

不過,如果你只是想創建一個對象,它往往更容易使用的對象字面

var myobj = {}; 

如果您只想從中創建一個實例,沒有理由使用構造函數。如果你想建立繼承,你可以使用Object.create[MDN]

+0

顯然這可能是可能的,但出於可讀性原因,你不想聲明實例的構造,這可能是去了解它... – user2071276

+0

變量不影命名功能的好方法相同的地方,不是嗎? –

+0

@Juan:正如我所說的,一個命名函數表達式不會創建與在封閉範圍該名稱的符號。該名稱僅在函數內部可用。嘗試'var foo = function bar(){};警報(巴);'。 –

相關問題