javascript - Class.prototype.Function() 与 Class.a Function()

标签 javascript prototype

在示例代码中:

var Class = function() {

}

Class.prototype.nonStaticFunction = function() {

}

Class.staticFunction = function() {

}

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

我相信 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 的新实例,因此内存使用情况相同。
  • 对象查找由 native 代码中的哈希表完成,[[GetProperty]]无论在原型(prototype)链中的哪个位置找到 key ,都会有不明显的不同。
  • 创建实例比不创建实例更昂贵,但如果您无论如何都需要创建一些东西,那么所花费的时间就没有 yield 或损失。

JavaScript 并没有真正的类,它们是经典语言的结构,但 JavaScript 是一种原型(prototype)语言

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

  • 按属性(您可能习惯的),例如

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

    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 中一样,用原型(prototype) 来定义构造函数


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

关于javascript - Class.prototype.Function() 与 Class.a Function(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32030662/

相关文章:

javascript - 更改 javascript 文件和 Controller 后如何更新 laravel 项目

javascript - 每 x 秒触发一个函数

javascript - 将键和原型(prototype)方法转换为驼峰式

javascript - 传入数字,Number.prototype.format

javascript - slider 不能在 IE8 中工作并且只能在 IE8 中工作?

javascript - AngularJS:在除一个字段外的所有字段上在 Controller 中进行过滤

javascript - 仅使用 javascript 旋转产品图像

javascript - 如果修改构造函数的原型(prototype)对象,现有构造函数是否不受影响?

javascript 检查对象原型(prototype)

javascript - 直接分配.prototype进行类继承