Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript定义类_Javascript_Class - Fatal编程技术网

Javascript定义类

Javascript定义类,javascript,class,Javascript,Class,定义类的最佳方式是什么?我知道,大多数情况下,这是您喜欢使用的选项,但这三个示例之间的直接区别是什么 例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

定义类的最佳方式是什么?我知道,大多数情况下,这是您喜欢使用的选项,但这三个示例之间的直接区别是什么

例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类=(函数(){ var Private={},Public={}

    Private._doSomething = function() {
        // something
    }

    Public.doSomethingElse = function() {
        // something else
    }
    return Public;
    })();

注意:下面的主要答案是在2012年写的。关于JavaScript自己的
功能(ES2015+),请参见结尾部分


“最佳”是一个固有的主观因素,但我会尝试指出每个方面的一些信息,让你自己决定“最佳”

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

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

    function trulyPrivateUtilityFunction() {
        // ...
    }

    function Class() {
      this.test = 'test';
    }
    return Class;
})();
示例1不是“提升”的。它作为逐步代码的一部分进行处理

函数将具有真实名称

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

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

例3 …只是示例1,没有私有类范围,但它也被“提升”-在执行任何分步代码之前定义了
函数。这意味着:

var c = new Class();
console.log(c.test); // Logs 'test'

function Class() {
    this.test = 'test';
}
请注意,尽管
Class
的定义较低,但它是在上面的代码运行之前完成的。示例1或示例2都不是这样

与示例1(而非示例2)一样,
函数具有真实名称


2015年,JavaScript有了自己的
语法。2019年,所有现代浏览器都支持JavaScript。如果需要支持IE,您可以使用Babel等工具进行传输。下面是
与OP的问题的关系:

示例1带有
在代码的逐步执行中处理。对于真正私有的内容具有真正私有的作用域(在匿名作用域函数中)。具有适当的名称

示例2带有
(这也是示例3带有

在代码的逐步执行中处理。没有示例1中真正私有的作用域(尽管私有字段和方法很快就会出现).有一个合适的名称。

不会有多大帮助,但实际上ECMAScript/JavaScript中没有类;如果您大量使用
instanceof
,您可能需要更彻底地学习该语言。首先要记住的是,实际上没有“类”这样的东西在JavaScript中。你可以用几种方式模拟这种结构,但是语言本身没有这样的结构。编辑——哈哈,虽然JavaScript确实没有类(最初是封顶的)特性(但是),但用类(小写)来说仍然是有效的对象的类型——例如,具有共同特征的对象。朱利安说得很对,有很多
类型的
实例的
,这通常意味着缺少一个技巧。我同意你的观点,T.J.;但是“类”的问题关键字是它通常隐式地与类继承一起进行,而JavaScript的继承是基于对象/实例的。你可以使用这个小脚本:如果你对用JavaScript做这件事感兴趣,我已经做了一个工具箱脚本,如果你最终做层次结构,我会简化它。好的,谢谢你TJ!是的,对于其他的,我有一个我很清楚javascript中还没有正式的类支持。我希望它会出现,但我想这仍在讨论中。我将定义。看看你的库!+1一些非常好的点。对于我来说,示例3是“最好的”,因为它最接近OO语言中的类。对于第一个示例,真正私有是什么意思?E示例3可以有私有方法和属性,如果您分别使用
this
关键字和
var
关键字来定义它们。您的lib看起来非常类似于此…@barry:我也应该这样写,我同时写了这两个。:-(事实上,请参见该博客文章顶部附近的插入框。)
const Class = (() => {
    let trulyPrivateInformation = 42;

    function trulyPrivateUtilityFunction() {
        // ...
    }

    return class Class {
        constructor() {
            this.test = 'test';
        }
    }
})();
class Class2 {
    constructor() {
        this.test = 'test';
    }
}

let c2 = new Class2();
console.log(typeof Class2);
console.log(c2.test);