定义课程的最佳方法是什么?我知道这大多数时候都是您喜欢使用的选择,但这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;
})();
答案 0 :(得分:7)
注意:以下主要答案是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
的示例2(也是带有class
的示例3)class Class2 {
constructor() {
this.test = 'test';
}
}
let c2 = new Class2();
console.log(typeof Class2);
console.log(c2.test);
在逐步执行代码时处理。没有真正的私有范围示例1(尽管私有字段和方法即将推出)。有一个正确的名字。