类定义的首选JavaScript习惯用法

类定义的首选JavaScript习惯用法,javascript,class,prototype,Javascript,Class,Prototype,在JavaScript中定义类的首选习惯用法是什么?我可以为复数定义一个构造函数,如下所示: function Complex(real, imag) { this.real = real; this.imag = imag || 0.0; this.add = function(other) { this.real += other.real; this.imag += other.imag; return this;

在JavaScript中定义类的首选习惯用法是什么?我可以为复数定义一个构造函数,如下所示:

function Complex(real, imag) {
    this.real = real;
    this.imag = imag || 0.0;
    this.add = function(other) {
        this.real += other.real;
        this.imag += other.imag;
        return this;
    }
}
或者我可以做以下事情:

function Complex(real, imag) {
    this.real = real;
    this.imag = imag || 0.0;
}

Complex.prototype = {
    add : function(other) {
        this.real += other.real;
        this.imag += other.imag;
        return this;
    }
}
由于教科书中的JavaScript:The Good Parts和最终指南中的JavaScript都没有定义类,因此我怀疑这些类的第一种定义方式是不同的——如果我计划使用继承,我怀疑我需要使用
prototype
。这对我来说似乎有点模糊--有人能澄清一下吗


我知道我可以使用前面提到的
Object.create()
方法,并以原型的方式做事,但我看不到人们在实践中经常这样做。

在第一个示例中,每个新对象都有自己的
add()
方法副本

在第二个示例中,每个新对象都通过
prototype
共享
add()
函数的一个副本


显然后者效率更高。

这是这么多问题的翻版。我想了这么多,但找不到确切的答案。也许有人可以证实我的怀疑,我可以消除这个问题。javascript中没有真正的类,只有新的函数实例。当原型化时,您创建了一个新的继承属性,因此当“父”被更改时,它将成为“子”等等。是的,我很清楚JS使用原型继承。类的概念仍然存在,即具有相同原型的对象被视为属于相同的类。可能以下帮助:使用原型生成的代码可以更好地优化,具有可识别的继承模式,并且在创建大量实例时会消耗更少的内存。如果您回复评论,最好使用@,否则不会通知被评论的人