2016-04-09 49 views
1

我一直在用「工廠功能」的概念,玩弄這樣考慮:你會如何寫一個「構造」

var HelloWorld = function() { 

    return { 
     hello: function() { console.log('hi'); } 
    } 
} 

正如我們知道的是實例爲:var helloWorld = HelloWorld();將在這樣的「構造」一個函數是它自己的函數?有沒有什麼辦法可以做:HelloWorld.hello(),而不是像一個類一樣「實例化」?或者這是一個完整的其他概念?

+1

[構造函數在JavaScript中具有特定含義](http://www.ecma-international.org/ecma-262/5.1/#sec-4.3.4),它與通過工廠創建對象無關函數(構造函數是通過[new operator]調用的(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new))。 – Quentin

回答

1

看看下面的代碼:

var HelloWorldFactory = function(text) { 
    return { 
     hello: function() { console.log(text); } 
    } 
}; 
var HelloWorld = { 
    hello: function() { console.log('hi2'); } 
}; 
var helloWorld = HelloWorldFactory('hi'); 
helloWorld.hello(); 
HelloWorld.hello(); 

如@Quentin在評論中提及致電HelloWorldFactory('hi');你是不是JS調用構造函數只是它返回一個對象的函數。

HelloWorld.hello();是不同的概念,因爲你只需使用aleardy定義的對象(它可以通過工廠創建或只是在代碼中定義)

1

在你的榜樣,你正在返回一個對象字面具有功能特性。你也可以直接返回一個函數。但最後,這是工廠模式,創建的函數的構造函數是Function函數,而不是函數的原型,因爲它是構造函數的情況。

函數是JS中的純對象。你可以像對象一樣對待它們。所以,盡你所能去做他們想做的事情。

function HelloWorld(){}; 

    HelloWorld.thank = function(){console.log("thanks")}; 
    HelloWorld.message = "hello"; 
HelloWorld.sayMessage = function(){console.log(HelloWorld.message)}; 

但是構造函數的功能稍有不同。他們被調用new關鍵字,正如我上面提到的,他們將自己的原型分配給創建的對象。這是JS最複雜的部分之一。我看到許多人認爲new是無用的,最好避免和Object.create()應該是首選,但事實並非如此。有時候,構造函數非常有用,因爲您可以在施工期間建立令人驚歎的原型關係。

相關問題