我完全理解为什么它是更好地使用原型,而不是构造函数的定义一个类的方法(即的“原型”与使用“这个”在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
将共享的statusCode
。200
从字面上看,所有实例中将共享相同数量的内存。如果您希望服务器在大多数情况下以状态码200进行响应,则这很有意义。那些Requests
需要不同的状态代码可以覆盖其默认statusCode
,它在内存中创建一个新的号码。
也就是说,如果您有10,000个并发请求,而其中5个是404请求,那么您在内存中仅用6个数字来表示所有10,000个就可以了statusCodes
。
总而言之,如果您希望大多数情况下大多数实例共享相同的默认值,那么使用原型可能是值得的。否则,您可以将其归类为编码样式。(显然,对于静态属性,请始终使用原型。)
请注意卢卡斯(Lucas)的答案,为什么原型中不能包含作为对象的属性(例如map
或headers
):所有实例将共享同一引用,因此对该引用的任何更新将更新所有实例。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句