[英]Javascript define class
定義課程的最佳方法是什么? 我知道這一事實大部分時間都是您喜歡使用的選擇,但這3個例子之間的直接區別是什么?
例1
var Class = (function(){
function Class() {
this.test = 'test'
}
return Class;
})();
var c = new Class();
console.log(typeof Class);
console.log(c.test);
例2
var Class2 = function(){
this.test = 'test'
};
var c2 = new Class2();
console.log(typeof Class2);
console.log(c2.test);
例3
function Class3(){
this.test = 'test'
};
var c3 = new Class3();
console.log(typeof Class3);
console.log(c3.test);
有時候我也會這樣使用它:var Class =(function(){var Private = {},Public = {};
Private._doSomething = function() {
// something
}
Public.doSomethingElse = function() {
// something else
}
return Public;
})();
注意:下面的主要答案是在2012年編寫的。有關JavaScript自己的class
功能(ES2015 +)的其他說明,請參閱最后一部分。
“最好”本身就是一種主觀的東西,但我會試着指出一些關於每一個的信息,並讓你自己決定“最好”。
...為您提供了一個方便的范圍(匿名函數),您可以在其中放置真正的私有類范圍的信息(和實用程序函數),只有Class
函數才能訪問:
var Class = (function(){
var trulyPrivateInformation = 42;
function trulyPrivateUtilityFunction() {
// ...
}
function Class() {
this.test = 'test';
}
return Class;
})();
示例1未“懸掛”。 它作為逐步代碼的一部分進行處理。
Class
函數將具有真實姓名。
...創建一個沒有名稱的函數,並將其分配給具有名稱的變量。 現代瀏覽器非常聰明,但至少在理論上,該功能是匿名的,它會影響您的工具可以為您提供哪些信息。 那個(從ES2015開始)有一個名字( Class2
),除了像IE這樣過時的環境。 它沒有示例1中的私有類范圍。
與示例1類似,示例2作為逐步代碼的一部分被處理,而不是被提升。
...只是沒有私有類范圍的示例1,但它也是“已提升” - 在執行任何分步代碼之前定義了Class
函數。 這意味着這有效:
var c = new Class();
console.log(c.test); // Logs 'test'
function Class() {
this.test = 'test';
}
請注意,即使Class
被定義為較低,也是在上面的代碼運行之前完成的。 對於實施例1或實施例2,情況並非如此。
與示例1(但不是2)一樣, Class
函數具有實名。
在2015年,JavaScript有自己的class
語法。 在2019年,它得到了所有現代瀏覽器的原生支持,如果您需要支持IE,您可以使用像Babel這樣的工具進行轉換。 以下是class
與OP問題的關系:
class
const Class = (() => {
let trulyPrivateInformation = 42;
function trulyPrivateUtilityFunction() {
// ...
}
return class Class {
constructor() {
this.test = 'test';
}
}
})();
在逐步執行代碼時處理。 真正的私人范圍(在匿名范圍內功能)具有真正的私人范圍。 有一個正確的名字。
class
(也是class
示例3) class Class2 {
constructor() {
this.test = 'test';
}
}
let c2 = new Class2();
console.log(typeof Class2);
console.log(c2.test);
在逐步執行代碼時處理。 沒有真正的私有范圍示例1(盡管私有字段和方法即將推出)。 有一個正確的名字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.