Class.prototype.aFunction() vs Class.aFunction()

Class.prototype.aFunction() vs Class.aFunction()

本文关键字:aFunction Class vs prototype      更新时间:2023-09-26

示例代码:

var Class = function() {
}
Class.prototype.nonStaticFunction = function() {
}
Class.staticFunction = function() {
}

nonStaticFunction相比,staticFunction是否存在速度、内存或任何其他显著特性?

我相信staticFunction具有以下特征,但我确定我遗漏了一些,我想知道何时使用它们。

  • this关键字将是Class函数而不是对象。
  • 可以不实例化Class对象而使用。

它们有完全不同的用例

Class.staticFunction; // function () {...}, `this` defaults to `Class`
Class.nonStaticFunction; // undefined

所以如果我们想使用Class作为命名空间,你可以选择你称之为"staticFunction"的样式

(new Class).staticFunction; // undefined
(new Class).nonStaticFunction; // function () {...}, `this instanceof Class`

所以如果我们想使用Class作为构造函数,你可以选择你称之为"nonStaticFunction"的样式

    在这两种情况下,没有新的实例staticFunctionnonStaticFunction在定义时间之后创建,所以内存使用是相同的。
  • 对象查找在本机代码中由哈希表完成,[[GetProperty]]无论在原型链的哪个位置找到键,都不会有明显的不同。
  • 创建实例比不创建实例更昂贵,但是如果你无论如何都需要创建一些东西,那么所花费的时间没有任何收益或损失。

JavaScript并没有真正的类,这些是来自经典语言的结构,但是JavaScript是一种原型语言

JavaScript中所有的对象,这些对象可以用两种不同的方式链接在一起

  • 通过属性(你可能已经习惯了),例如

    foo = {};
    foo.bar = {};
    foo.bar.baz = {fizz: 'buzz'};
    foo.bar.baz.fizz; // "buzz"
    
  • 通过原型链,例如

    baz = {fizz: 'buzz'};
    bar = Object.create(baz);
    foo = Object.create(bar);
    foo.fizz; // "buzz" via
    // no own _fizz_ on `foo`
    // no own _fizz_ on `bar`    ( = Object.getPrototypeOf(foo) )
    // own _fizz_ found on `baz` ( = Object.getPrototypeOf(bar) )
    
ES 6 class语法糖用于定义具有原型构造器,就像您在ES 5中所做的那样。

JavaJavaScript是完全不同的语言,不要因为它们的名字就认为它们相似。