2011-09-08 12 views
5

は、次のコードを考えてみましょう:だから"newing" JavaScriptの関数 - それはどういう意味ですか?

var f = function() { return 10; } 
typeof f;       // returns "function" 
f();        // returns 10 

var g = f; 
g();        // returns 10, obviously 

var h = new f; 
h;        // console evaluates to f - ???? 
h();        // Type error - called_non_callable 
typeof h;       // returns "object" 

を、hはここ何ですか? Chromeのコンソールはそれをfと評価しているようですが、呼び出し可能ではありません。このような機能を「新しい」とはどういう意味ですか? hはfとどのように関連していますか?

余談として

、これらの2行は等価であることが表示されます。

var h = new f; 
var h = new f(); 

どうなっているのですか?

+2

[JavaScriptの 'new'キーワードは何ですか?](http://stackoverflow.com/questions/1646698/what-is-the-new-keyword-in-javascript) –

答えて

4

あなたの混乱の根源は、Chromeがコンソール上のオブジェクトを表す方法です。あなたの例では

表現new f()は、Chromeのコンソール出力に「f」として表されますが、ちょうどこの特定のコンソールの単なる「利便性」として、例えば、以下のオブジェクトをログに記録されています

({constructor: function Foo(){}}); 

Foo」と表示されます。基本的にコンソールはの表現を探します。そのオブジェクトのコンストラクタはのインスタンスです。

コンソールにはfが表示されますが、機能をログに記録していない場合、new演算子はf.prototypeから継承するオブジェクトを生成します。

あなたは関数から10を戻ってきているが、あなたはnewでそれを呼び出し、戻り値の型がプリミティブであるため、値は破棄され、フォームf.prototypeを継承し、新たに作成したオブジェクトが返されます。例えば

:一方

var F = function() { return 10; }; 
F.prototype.inherited = 'foo'; 

var h = new F(); // the 10 returned is ignored 
h instanceof F; // true 
h.inherited; // "foo" 

、あなたはnewオペレータがscened後ろ作成(およびコンストラクタのプロトタイプから継承)という、コンストラクタからオブジェクトのインスタンスをオブジェクトを返す場合は失われます例えば:人々があなたのコードに明確さを追加するために括弧を使用することをお勧めしますが、

var F = function() { return {}; }; 
F.prototype.inherited = 'foo'; 

var h = new F(); // the empty object is returned 
h instanceof F; // false 
h.inherited; // undefined 

はい、new f;new f();は、完全に同等です。

+0

ベストオブ1それについての説明!簡単にしていただきありがとうございます。 – demisx

1

基本的に、新しいキーワードは、新しいオブジェクトのコンストラクタとしてfを呼び出します。 StackOverflowの上でこの質問への最初の応答は、非常にうまくそれを合計:

What is the 'new' keyword in JavaScript?

4

これはJavaScriptでオブジェクト指向の仕組みです。関数上でnewを呼び出すと、この関数はクラスのコンストラクタであるかのように扱われます(他の言語と同様にクラスを定義するキーワードclassはjに存在しません)。

を呼び出すとhfのオブジェクトになり、オブジェクト自体は呼び出し可能ではありません(そのため、called_non_callableとなります)。

あなたは「クラス」いくつかのmethotsを与えたいならば、あなたはこのようにそれを実行する必要があります。

function cat(name) { 
    this.name = name; 
    this.talk = function() { 
     alert(this.name + " says meeow!") 
    } 
} 

cat1 = new cat("felix") 
cat1.talk() //alerts "felix says meeow!" 

cat2 = new cat("ginger") 
cat2.talk() //alerts "ginger says meeow!" 

this tutorialpage 2からの例です。詳細については、ask Google for object-orientation in JavaScriptをお読みください。

1

JavaScriptでは、関数は単なる関数ではなく、単なるオブジェクトではありません。型のコンストラクターの定義にも使用されます。

一般的に言えば、関数fがある場合、その関数は意図しているかどうかにかかわらず型を定義します。そうライン

var h = new f(); 

は、そのタイプfあるオブジェクトhを定義します。

私はライン

var h = new f; 

を見たことがないが、私はそれが他の行と同じと仮定していません。

2

https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special/this、特に「機能コンテキスト」のセクションを読むことをお勧めします。 var h = new f;

これは言う:あなたはnew機能、新しいオブジェクトを作成している一言で言えば

、「タイプfhという名前の変数が参照する新しいオブジェクトを作成します」。この関数は、あなたが期待しているものではなく、コンストラクタとして扱われます。

オブジェクトが作成されると、呼び出し可能になりません(そのため、h()というエラーが発生しています)。

コンストラクタの()は、ほとんどの言語(JavaScriptは除外されません)では必須です(一部の言語では必須パラメータがない限り)。

関連する問題