为什么在原型而不是构造函数中声明实例属性?

月棱镜功率

我完全理解为什么它是更好地使用原型,而不是构造函数的定义一个类的方法(即的“原型”与使用“这个”在JavaScript? 不过,我最近碰到一个前来HashMap类定义count 属性的原型和map构造函数中属性:

js_cols.HashMap = function(opt_map, var_args) {

    /**
     * Underlying JS object used to implement the map.
     * @type {!Object}
     * @private
     */
    this.map_ = {};

    /...
}

/**
 * The number of key value pairs in the map.
 * @private
 * @type {number}
 */
js_cols.HashMap.prototype.count_ = 0;

count在原型中声明实例属性而不是this.count_ = 0;在构造函数中声明是否有优势如果是这样,为什么还不js_cols.HashMap.prototype.map_ = {};呢?

编辑:提出了一个类似的问题:为什么在原型上为JavaScript中的实例变量声明属性,并提出了“默认值”作为用例,但没有解释为什么这比仅在容器中定义默认值更为可取。构造函数。

月棱镜功率

我认为HashMap不是在原型中声明实例属性的好处的最佳示例而是考虑一个Response类:

function Response() {
   this.headers = {};
}
Response.prototype.statusCode = 200;

所有的实例Response将共享的statusCode200从字面上看,所有实例中将共享相同数量的内存。如果您希望服务器在大多数情况下以状态码200进行响应,则这很有意义那些Requests需要不同的状态代码可以覆盖其默认statusCode,它在内存中创建一个新的号码。

也就是说,如果您有10,000个并发请求,而其中5个是404请求,那么您在内存中仅用6个数字来表示所有10,000个就可以了statusCodes

总而言之,如果您希望大多数情况下大多数实例共享相同的默认值,那么使用原型可能是值得否则,您可以将其归类为编码样式。(显然,对于静态属性,请始终使用原型。)

请注意卢卡斯(Lucas)的答案,为什么原型中不能包含作为对象的属性(例如mapheaders):所有实例将共享同一引用,因此对该引用的任何更新将更新所有实例。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么将方法放在类的原型上而不是在构造函数中声明呢?

来自分类Dev

在构造函数中声明的属性与原型

来自分类Dev

为什么在值构造函数中声明的类型不是在Haskell中声明的类型?

来自分类Dev

为什么实例不继承没有原型关键字添加到构造函数的属性

来自分类Dev

原型属性的构造函数实例的奇怪行为

来自分类Dev

为什么在类的构造函数中声明的属性不存在?

来自分类Dev

如果未覆盖构造函数属性,为什么对象的构造函数属性指向扩展函数中的父函数的构造函数而不是F

来自分类Dev

如果未重写构造函数属性,为什么对象的构造函数属性指向扩展函数中的父函数的构造函数而不是F

来自分类Dev

为什么不能使用构造函数/原型组合模式访问此实例变量?

来自分类Dev

JS中的构造函数和原型属性

来自分类Dev

为什么在函数原型中使用“ [*]”而不是“ []”?

来自分类Dev

原型方法不是函数,为什么?

来自分类Dev

为什么要在构造函数中实例化变量,以及为什么要使用属性来访问变量

来自分类Dev

如果更改了构造函数的原型,为什么对象的构造函数属性也会发生变化?

来自分类Dev

为什么javascript函数原型需要修复构造函数?

来自分类Dev

为什么(或不是)在构造函数中设置字段是线程安全的?

来自分类Dev

为什么在构造函数初始化类的属性时声明其属性

来自分类Dev

为什么替换构造函数的原型没有反映在对象中?

来自分类Dev

在构造函数内部*分配原型方法-为什么不呢?

来自分类Dev

为什么原型的构造函数会引用回自身?

来自分类Dev

原型对象的构造函数属性

来自分类Dev

为什么在我的代码中调用复制构造函数而不是移动构造函数?

来自分类Dev

在构造函数angular 2中声明属性

来自分类Dev

在构造函数angular 2中声明属性

来自分类Dev

在es6中是否可以实例化一个类并定义类似于经典构造函数的原型属性?

来自分类Dev

为什么调用复制构造函数而不是移动构造函数?

来自分类Dev

为什么选择复制构造函数而不是移动构造函数

来自分类Dev

为什么调用复制构造函数而不是移动构造函数?

来自分类Dev

为什么选择复制构造函数而不是移动构造函数

Related 相关文章

  1. 1

    为什么将方法放在类的原型上而不是在构造函数中声明呢?

  2. 2

    在构造函数中声明的属性与原型

  3. 3

    为什么在值构造函数中声明的类型不是在Haskell中声明的类型?

  4. 4

    为什么实例不继承没有原型关键字添加到构造函数的属性

  5. 5

    原型属性的构造函数实例的奇怪行为

  6. 6

    为什么在类的构造函数中声明的属性不存在?

  7. 7

    如果未覆盖构造函数属性,为什么对象的构造函数属性指向扩展函数中的父函数的构造函数而不是F

  8. 8

    如果未重写构造函数属性,为什么对象的构造函数属性指向扩展函数中的父函数的构造函数而不是F

  9. 9

    为什么不能使用构造函数/原型组合模式访问此实例变量?

  10. 10

    JS中的构造函数和原型属性

  11. 11

    为什么在函数原型中使用“ [*]”而不是“ []”?

  12. 12

    原型方法不是函数,为什么?

  13. 13

    为什么要在构造函数中实例化变量,以及为什么要使用属性来访问变量

  14. 14

    如果更改了构造函数的原型,为什么对象的构造函数属性也会发生变化?

  15. 15

    为什么javascript函数原型需要修复构造函数?

  16. 16

    为什么(或不是)在构造函数中设置字段是线程安全的?

  17. 17

    为什么在构造函数初始化类的属性时声明其属性

  18. 18

    为什么替换构造函数的原型没有反映在对象中?

  19. 19

    在构造函数内部*分配原型方法-为什么不呢?

  20. 20

    为什么原型的构造函数会引用回自身?

  21. 21

    原型对象的构造函数属性

  22. 22

    为什么在我的代码中调用复制构造函数而不是移动构造函数?

  23. 23

    在构造函数angular 2中声明属性

  24. 24

    在构造函数angular 2中声明属性

  25. 25

    在es6中是否可以实例化一个类并定义类似于经典构造函数的原型属性?

  26. 26

    为什么调用复制构造函数而不是移动构造函数?

  27. 27

    为什么选择复制构造函数而不是移动构造函数

  28. 28

    为什么调用复制构造函数而不是移动构造函数?

  29. 29

    为什么选择复制构造函数而不是移动构造函数

热门标签

归档