1

私はjavascriptでダグラスクロックフォードのビデオを見ていました。彼が言ったことの1つは、クラスにnewを使用するのを忘れた場合に備えて、ブラウザではウィンドウであるグローバル名前空間にデータを入力することです。これをもっとよく理解したかったので、以下のようにテストしてみました

var User = function(first,last){
  this.name = first + " " + last;
}

var user = new User("John","Resig");
alert(window.name); // expected to see undefined, but was John Resig
alert(user.name); // this should only show John Resig correctly

var user1 = User("Douglas","Crockford");
alert(window.name); // expected to see Douglas Crockford and shown correctly

現在、グローバル名前空間の理解が間違っているか、例が間違っているという2つの可能性があります。あなたが私を正しい方向に向けることができれば感謝します。

4

2 に答える 2

2

理由はthisUser関数が使用されていないwindowかどうかを参照することにnewあります。関数のデフォルトthis(従来のJavaScript [1])はwindowです。

[1]をサポートするブラウザ'use strict'は、厳密モードではこのように動作しません。代わりに、、、、などが使用されていない場合thisは例外がスローされます。http://jsfiddle.net/ufTq9/を参照してくださいundefinednewapplycallbind

于 2012-09-08T05:51:26.973 に答える
0

あなたはこのようなトリックを試すことができます:

var User = function(first,last){
   if(this == window)
       return new User(first, last);

   this.name = first + " " + last;
}
var normalUser = new User('first', 'last');
var globalUser = User('fname', 'lname');
// it is undefined :D
alert(typeof window.fname);

new重要なのは、スコープ(thisキーワード)をチェックすることによって、キーワードが構成で使用されたかどうかをチェックし、使用されなかった場合( this == window)は、オブジェクトを強制的newに返すことができるということです。

于 2012-09-08T06:01:46.063 に答える