[Effective JavaScript 笔记]第34条:在原型中存储方法
2016-06-15 09:19
423 查看
js中完全有可能不借助原型进行编程。不用在其原型中定义任何的方法。
这样创建没有什么问题,但这里当我们构造多个User实例的时候,会占用过多的内存空间。
可以从下面的图里看出它们在内存中的情况。
当产生多个实例时
其内存结构图
将方法存储在实例对象中会优化查找速度,当使用如u1.toString()方法,不需要搜索原型链来查找toString的实现。但,现代的js引擎深度优化了原型查找,所以将方法复制到实例对象并不一定保证速度有明显的提升。而且实例方法比起原型方法肯定会占用更多的内存。
将方法存储于原型中优于存储在实例对象中
创建对象
构造函数法
所有属性和方法都在构造函数中定义function User(name,pwd){ this.name=name; this.pwd=pwd; this.toString=function(){ return '[User '+this.name+']'; }; this.checkPwd=function(pwd){ return hash(pwd)===this.pwd; } }
这样创建没有什么问题,但这里当我们构造多个User实例的时候,会占用过多的内存空间。
var u1=new User(/* 一些参数 */); var u2=new User(/* 一些参数 */); var u3=new User(/* 一些参数 */);
可以从下面的图里看出它们在内存中的情况。
原型和构造函数相结合
function User(name,pwd){ this.name=name; this.pwd=pwd; this.toString=function(){ return '[User '+this.name+']'; }; this.checkPwd=function(pwd){ return hash(pwd)===this.pwd; } }User.prototype.toString=function(){
return '[User '+this.name+']';
};
User.prototype.checkPwd=function(pwd){
return hash(pwd)===this.pwd;
}
当产生多个实例时
var u1=new User(/* 一些参数 */); var u2=new User(/* 一些参数 */); var u3=new User(/* 一些参数 */);
其内存结构图
对比
可以看出,将方法存储在原型中,使其可以被所有的实例使用,而不需要给每个实例对象增加额外的属性。将方法存储在实例对象中会优化查找速度,当使用如u1.toString()方法,不需要搜索原型链来查找toString的实现。但,现代的js引擎深度优化了原型查找,所以将方法复制到实例对象并不一定保证速度有明显的提升。而且实例方法比起原型方法肯定会占用更多的内存。
提示
将方法存储在实例对象中将创建该函数的多个副本,因为每个实例对象都有一份副本将方法存储于原型中优于存储在实例对象中
相关文章推荐
- JavaScript 基础知识--对象
- 手机浏览器调用手机qq客户端的js
- Valid Palindrome
- EL表达式常见用法
- JavaScript中的事件委托
- JS中showModalDialog 详细使用
- js时间比较
- jsf
- JSTL(自定义标签)
- JSP中include指令和include动作的区别
- [学习笔记]初识javascript
- Implement strStr() - Javascript
- Two Sum
- Javascript 创建对象的6种方法
- JSP中三种弹出对话框的用法《转》
- 【翻译】Ext JS 6.2 早期访问版本发布
- 【翻译】Ext JS 6.2 早期访问版本发布
- 【翻译】Ext JS 6.2 早期访问版本发布
- 【翻译】Ext JS 6.2 早期访问版本发布
- js数组去重