2016-04-09 3 views
1

を記述します関数はそれ自身の関数ですか?そして私はちょうど行うことができる方法はありますか?HelloWorld.hello() "クラス"のように "インスタンス化"の代わりに?それとも、まったく別のコンセプトですか? @Quentinあなたはコンストラクタが、オブジェクトを返すだけの機能JSを呼び出していないHelloWorldFactory('hi');を呼び出すことによって、コメントで述べたようには、どのように私はそう考える「ファクトリ関数」の概念で遊んでてきた「コンストラクタ」

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(); 

+1

[コンストラクタはJavaScriptで特定の意味を持ちます](http://www.ecma-international.org/ecma-262/5.1/#sec-4.3.4)、工場からオブジェクトを作成することとは関係ありません関数(コンストラクタ関数は[new演算子](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new)で呼び出されます).. – Quentin

答えて

1

は、次のコードを見てみましょう。あなたはちょうどあなたが機能プロパティを持つオブジェクトリテラルを返している(それは工場を経て作成されたか、単にコードで定義することができます)あなたの例では

1

をaleardy定義されたオブジェクトを使用しているためHelloWorld.hello();を行う

は異なる概念です。関数を直接返すこともできます。しかし、最終的にはこれがファクトリパターンであり、作成されたファンクションのコンストラクタは、HelloWorldファンクションではなく、Functionファンクションであり、コンストラクタの場合と同じです。

関数はJS内の純粋なオブジェクトです。それらをオブジェクトのように扱うことができます。それで、あなたが彼らと何か好きなことをしてください。

function HelloWorld(){}; 

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

ただし、コンストラクタの機能は少し異なります。それらはnewキーワードで呼び出され、上記のように、作成したオブジェクトに独自のプロトタイプを割り当てます。これはJSの最も複雑な部分の1つです。私は多くの人々がnewが役に立たないと思っているのを見てきました。そして、より良い方が避けられ、Object.create()が代わりに好まれるべきですが、そうではありません。構築時に素晴らしいプロトタイプの関係を確立できるので、コンストラクタ関数は非常に便利です。

関連する問題