代碼
console.log(foo.a);
console.log(foo.c);
意味着你相信a
將被設定爲foo.a = "10"
等價,即設置「類」 foo
的靜態字段。 JavaScript中不是這種情況。
a = "10";
此設置全局變量a
爲值"10"
,創建一個全局變量插槽如果必要的話。應該避免這種類型的全局分配,並被諸如JSLint之類的工具捕獲。
this.b = "20";
這設置爲this
參數的函數來"20"
傳遞的對象的字段,創建磁場槽如果必要的話。請注意,如果您直接撥打foo
,例如foo()
,沒有new
,全球範圍通過爲this
和this.b
也會創建一個全局變量。這種類型的錯誤可以通過嚴格模式來捕獲。如果以嚴格模式執行,undefined
作爲參數this
被傳入,這將引發異常。
var foo1 = new foo();
這產生與__proto__
屬性設置爲foo
的prototype
屬性的值的新的,空的,對象,然後調用foo
傳遞新的對象作爲this
參數。__proto__
的所有字段都顯示爲對象字段的默認值。這導致了向構造函數的prototype
對象添加方法以及在構造函數中初始化字段的慣例。繼承可以通過構造一個對象,該對象的祖先原型對象爲其值爲__proto__
的值並將其分配給構造函數的函數prototype
屬性。構造函數還會調用祖先構造函數(不帶new
),並將其this
作爲構造函數的this
參數(使用apply
或call
)。這有點尷尬,所以ECMAScript 6將這個標準化爲一個class
構造,其大致轉化爲我所描述的。
你總是可以使用全局變量。 – JCOC611
@ JCOC611如何訪問var「a」?它甚至有可能嗎? – JavaDeveloper
它不是。這是一個私有範圍變量的形式。 –