定义课程的最佳方法是什么?我知道这一事实大部分时间都是您喜欢使用的选择,但这3个例子之间的直接区别是什么?
例1
var Class = (function(){
function Class() {
this.test = 'test'
}
return Class;
})();
var c = new Class();
console.log(typeof Class);
console.log(c.test);
Run Code Online (Sandbox Code Playgroud)
例2
var Class2 = function(){
this.test = 'test'
};
var c2 = new Class2();
console.log(typeof Class2);
console.log(c2.test);
Run Code Online (Sandbox Code Playgroud)
例3
function Class3(){
this.test = 'test'
};
var c3 = new Class3();
console.log(typeof Class3);
console.log(c3.test);
Run Code Online (Sandbox Code Playgroud)
有时候我也会这样使用它:var Class =(function(){var Private = {},Public = {};
Private._doSomething = function() {
// something
}
Public.doSomethingElse = function() {
// something else
}
return Public;
})();
Run Code Online (Sandbox Code Playgroud)
注意:下面的主要答案是在2012年编写的.有关JavaScript自身class
功能的其他说明(ES2015 +),请参阅最后一部分.
"最好"本身就是一种主观的东西,但我会试着指出一些关于每一个的信息,让你自己决定"最好".
...为您提供了一个方便的范围(匿名函数),您可以在其中放置真正的私有类范围的信息(和实用程序函数),只有Class
函数可以访问:
var Class = (function(){
var trulyPrivateInformation = 42;
function trulyPrivateUtilityFunction() {
// ...
}
function Class() {
this.test = 'test';
}
return Class;
})();
Run Code Online (Sandbox Code Playgroud)
示例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';
}
Run Code Online (Sandbox Code Playgroud)
请注意,即使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';
}
}
})();
Run Code Online (Sandbox Code Playgroud)
在逐步执行代码时处理.真正的私人范围(在匿名范围内功能)具有真正的私人范围.有一个正确的名字.
class
(也是实施例3 class
)class Class2 {
constructor() {
this.test = 'test';
}
}
let c2 = new Class2();
console.log(typeof Class2);
console.log(c2.test);
Run Code Online (Sandbox Code Playgroud)
在逐步执行代码时处理.没有真正的私有范围示例1(尽管私有字段和方法即将推出).有一个正确的名字.