new myFunction() vs new myClass()



我一直在对JavaScript中的OOP进行一些研究,我在MDN上看到了这些注释。

函数语法

我之前创建过一些类,但我使用的语法是创建一个函数。见下文。

function myFunction(myProp1, myProp2)
{
    // see if set, otherwise use the default value (after the colon)
    myProp1 = typeof myProp1 !== "undefined" ? myProp1 : 1;
    myProp2 = typeof myProp2 !== "undefined" ? myProp2 : 2;
    // simple function
    this.doSomething = function ()
    {
        return myProp1 + myProp2;
    }
}
var myObj = new myFunction(2, 4);
myObj.doSomething(); // returns 6

类语法

今天我发现使用以下代码可以实现相同的目标。

class myClass
{
    constructor(myProp1, myProp2)
    {
        // see if set, otherwise use the default value (after the colon)
        this.myProp1 = typeof myProp1 !== "undefined" ? myProp1 : 1;
        this.myProp2 = typeof myProp2 !== "undefined" ? myProp2 : 2;
    }
    // simple function
    doSomething()
    {
        return this.myProp1 + this.myProp2;
    }
}
var myObj = new myClass(2, 4);
myObj.doSomething(); // returns 6

现在的问题来了

是否真的存在差异,或者仅仅是我使用哪种方法来创建新对象的品味差异?

编辑
为了澄清起见,我将在下面提出一些疑问。

问题:

  1. @MasterBob提到了支持。不是所有浏览器都支持class方式吗?如果不支持,则不支持哪些浏览器?
  2. 遗产。任一版本是否继承不同的属性或完全相同?

没有太多区别,但这里有一些:

  1. class myClass extends myClass2

现在,这可能不是那么成问题,因为有 myFunction.prototype = Object.create(myFunction2); ,但是是的,它可能有点复杂。

  1. 浏览器支持。

ECMAScript 6 引入了类,但是构造函数存在了多久?当然,相当长的时间。某些浏览器可能不支持类。

因此,总而言之,在我看来,您应该使用构造函数来支持浏览器。但是,如果你打算在遥远的将来的某个时候编写这个代码 - 类更整洁,更容易阅读。

引用MDN

ECMAScript 2015 中引入的 JavaScript 类是语法糖 基于 JavaScript 现有的基于原型的继承。

进一步它说

类语法没有向 JavaScript 引入新的面向对象的继承模型

我认为考虑到这一点,我们可以说这只是口味的差异,至少取决于

ECMAScript 2015 (第 6 版, ECMA-262(

我发现的一个区别是,使用旧语法扩展像 Promise 这样的内置类是不可能的,但我认为使用新语法是可能的。我不确定目前它的支持程度如何。这个问题的更多详细信息:在 Javascript 中扩展承诺。

有一些差异,这不仅仅是品味问题。两者之间最重要的区别:你可以忘记在第一个示例中使用new,第二个示例需要它。

最新更新