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

moo*_*wer 6 javascript prototype

我完全理解为什么它是更好地使用原型,而不是构造函数的定义一个类的方法(即对"这个"在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;
Run Code Online (Sandbox Code Playgroud)

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

编辑:一个类似的问题被问到,为什么在JavaScript中为实例变量的原型声明属性,并且"默认值"被引发作为用例,但是没有解释为什么这比仅仅定义默认值更合乎需要.构造函数.

moo*_*wer 5

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

function Response() {
   this.headers = {};
}
Response.prototype.statusCode = 200;
Run Code Online (Sandbox Code Playgroud)

的所有实例都Response将共享statusCode200-从字面上看,在存储相同数量将在所有实例共享.如果您希望服务器在大多数时间以状态代码200响应,这是有意义.Requests需要不同状态代码的那些可以覆盖它们的默认值statusCode,这会在内存中创建一个新数字.

即如果你有10,000个并发请求,其中5个是404,你只能在内存中有6个数字代表所有10,000个statusCodes.

总而言之,如果您希望大多数实例在大多数时间共享相同的默认值,那么使用原型可能是值得.否则,你可以将它归结为编码风格.(显然对于静态属性,总是使用原型.)

注意看卢卡斯的为什么这是一个对象(例如一个属性的答案map或者headers)不能在原型:所有实例将共享相同的参考,因此,任何更新到参考将更新所有实例.