本系列作为EffectiveJavaScript的读书笔记。

不使用prototype进行JavaScript的编码是全然可行的,比如:

function User(name, passwordHash) {
this.name = name;
this.passwordHash = passwordHash;
this.toString = function() {
return "[User " + this.name + "]";
};
this.checkPassword = function(password) {
return hash(password) === this.passwordHash;
};
} var u1 = new User(/* ... */);
var u2 = new User(/* ... */);
var u3 = new User(/* ... */);

当创建了多个User类型的实例时,就存在问题了:不仅是name和passwordHash属性在每一个实例上都存在,toString和checkPassword方法在每一个实例上都有一份拷贝。就像下图表示的那样:

可是,当toString和checkPassword被定义在prototype上时,上图就变成以下这个样子了:

toString和checkPassword方法如今定义在了User.prototype对象上,也就意味着这两个方法仅仅存在一份拷贝,并被全部的User实例共享。

或许你会觉得将方法作为拷贝放在每一个实例上。会节省方法查询的时间。(当方法定义在prototype上时。首先会在实例本身上寻找方法,假设没有找到才会去prototype上继续找)

可是在现代的JavaScript运行引擎中,对方法的查询进行了大量优化,所以这个查询时间差点儿是不须要考虑的,那么将方法放在prototype对象上就节省了非常多内存。

总结:

  1. 将方法存放在实例上会导致每一个实例都会拥有该方法的一份拷贝。导致内存的浪费。
  2. 优先将方法存放在prototype对象上。

最新文章

  1. JMeter学习(一)工具简单介绍
  2. js-提前声明和new操作符理解
  3. 调试Python代码的工具
  4. JS-SDK微信支付开发攻略
  5. CSS 设计彻底研究(三)深入理解盒子模型
  6. [Usaco2008 Open] Clear And Present Danger 寻宝之路[最短路][水]
  7. hdu_5723_Abandoned country(最小生成树)
  8. jsonpath读取json数据格式公用方法!!!
  9. OC—可变数组NSMutableArray
  10. C# 文件操作类大全
  11. IdentityModel 中文文档(v1.0.0) 目录
  12. [转] Linux Asynchronous I/O Explained
  13. 这10个Python项目超有趣!
  14. Python—requests模块详解
  15. 【个人阅读】软件工程M1/M2做一个总结
  16. 不同AI学科之间的联系
  17. 【LOJ】#2888. 「APIO2015」巴邻旁之桥 Palembang Bridges
  18. [Javascript] Prototype 2 Object.create()
  19. Js读取Excel
  20. mahout运行测试与kmeans算法解析

热门文章

  1. Vue入门教程(2)
  2. java方法名的重载
  3. angular-Then的用法
  4. 树莓派学习笔记—— 源码方式安装opencv
  5. [Chromium]怎样安全的使用PostTask
  6. [React] Work with HTML Canvas in React
  7. Android高级控件(一)——ListView绑定CheckBox实现全选,添加和删除等功能
  8. node 内存消息队列
  9. 【MongoDB】深入了解MongoDB不可不知的十点
  10. oracle 下操作blob字段是否会产生大量redo