Class.prototype.aFunction() 对比 Class.aFunction()

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

在示例代码中:

var Class = function() {

}

Class.prototype.nonStaticFunction = function() {

}

Class.staticFunction = function() {

}

staticFunction 是否比 nonStaticFunction 有速度、内存或任何其他重要特征?

我相信 staticFunction 具有以下特征,但我确定我遗漏了一些特征,我想知道什么时候使用一个而不是另一个。

它们有完全不同的用例

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

因此,如果我们想将 Class 用作 命名空间 ,您需要选择调用 "staticFunction"[= 的样式64=]

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

因此,如果我们想将 Class 用作 构造函数 ,您需要选择调用 "nonStaticFunction"[= 的样式64=]

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

Java脚本实际上没有类,这些是古典语言的结构但是Java Script 是一种原型语言

我们在 JavaScript 中只有 Objects,而这些 Objects 可以用两种不同的方式链接在一起

  • 按属性(您可能已经习惯了),例如

    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是完全不同的语言,不要以为它们相似因为他们的名字。