Javascript定义类

时间:2012-12-05 14:07:38

标签: javascript 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;
    })();

1 个答案:

答案 0 :(得分:7)

注意:以下主要答案是2012年编写的。有关JavaScript自身class功能(ES2015 +)的其他说明,请参阅最后一页。


“最佳”本身就是一种主观的东西,但我会尝试指出一些有关每种情况的信息,并让你自己决定“最好”。

示例1

...为您提供了一个方便的范围(匿名函数),您可以在其中放置真正的私有类范围的信息(和实用程序函数),只有Class函数才能访问:

var Class = (function(){
    var trulyPrivateInformation = 42;

    function trulyPrivateUtilityFunction() {
        // ...
    }

    function Class() {
      this.test = 'test';
    }
    return Class;
})();

示例1未“悬挂”。它作为逐步代码的一部分进行处理。

Class函数将有一个真实姓名。

示例2

...创建一个没有名称的函数,并将其分配给具有名称的变量。现代浏览器非常聪明,但至少在理论上,该功能是匿名的,它会影响您的工具可以为您提供的信息。(从ES2015开始)有一个名称(Class2)除外在IE等过时的环境中。它没有示例1的私有类范围。

与示例1类似,示例2作为逐步代码的一部分进行处理,而不是悬挂。

示例3

...只是没有私有类范围的示例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

的示例1
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(尽管私有字段和方法即将推出)。有一个正确的名字。