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引擎深度优化了原型查找,所以将方法复制到实例对象并不一定保证速度有明显的提升。而且实例方法比起原型方法肯定会占用更多的内存。

提示

  • 将方法存储在实例对象中将创建该函数的多个副本,因为每个实例对象都有一份副本

  • 将方法存储于原型中优于存储在实例对象中

[Effective JavaScript 笔记]第34条:在原型中存储方法的更多相关文章

  1. [Effective JavaScript 笔记]第35条:使用闭包存储私有数据

    js的对象系统并没有特别鼓励或强制信息隐藏.所有的属性名都是一个字符串,任意一个程序都可以简单地通过访问属性名来获取相应的对象属性.例如,for...in循环.ES5的Object.keys()和Ob ...

  2. [Effective JavaScript 笔记]第18条:理解函数调用、方法调用及构造函数调用之间的不同

    面向对象编程中,函数.方法.类的构造函数是三种不同的概念. JS中,它们只是单个构造对象的三种不同的使用模式. 三种不同的使用模式 函数调用 function hello(username){ ret ...

  3. [Effective JavaScript 笔记] 第4条:原始类型优于封闭对象

    js有5种原始值类型:布尔值.数字.字符串.null和undefined. 用typeof检测一下: typeof true; //"boolean" typeof 2; //&q ...

  4. [Effective JavaScript 笔记]第28条:不要信赖函数对象的toString方法

    js函数有一个非凡的特性,即将其源代码重现为字符串的能力. (function(x){ return x+1 }).toString();//"function (x){ return x+ ...

  5. [Effective JavaScript 笔记] 第5条:避免对混合类型使用==运算符

    “1.0e0”=={valueOf:function(){return true;}} 是值是多少? 这两个完全不同的值使用==运算符是相等的.为什么呢?请看<[Effective JavaSc ...

  6. [Effective JavaScript 笔记]第27条:使用闭包而不是字符串来封装代码

    函数是一种将代码作为数据结构存储的便利方式,代码之后可以被执行.这使得富有表现力的高阶函数抽象如map和forEach成为可能.它也是js异步I/O方法的核心.与此同时,也可以将代码表示为字符串的形式 ...

  7. [Effective JavaScript 笔记]第51条:在类数组对象上复用通用的数组方法

    前面有几条都讲过关于Array.prototype的标准方法.这些标准方法被设计成其他对象可复用的方法,即使这些对象并没有继承Array. arguments对象 在22条中提到的函数argument ...

  8. [Effective JavaScript 笔记]第45条:使用hasOwnProperty方法以避免原型污染

    之前的43条,44条讨论了属性的枚举,但都没有彻底地解决属性查找中原型污染的问题.看下面关于字典的一些操作 'zhangsan' in dict; dict.zhangsan; dict.zhangs ...

  9. [Effective JavaScript 笔记]第43条:使用Object的直接实例构造轻量级的字典

    js对象的核心是一个字符串属性名与属性值的映射表.使用对象实现字典易如反掌,字典是可变长的字符串与值的映射集合. for...in js提供了枚举一个对象属性名的利器--for...in循环. var ...

随机推荐

  1. jQuery问题:$XXX is not a function

    用火狐浏览器打开,js代码一段不执行,F12以后看见下面的错误: 网上查看说是jQuery文件引用的问题,把jQuery.js引入语句修改了一下,果然没有错了. 我原来的引用语句是:<scrip ...

  2. Shadowsock搭建

    搭建Shadowsocks服务端: 搭建Shadowsocks之前首先必须购买一个VPS.一般VPS提供商会给一个测试地址,购买之前最好先ping一下速度.也可以通过以下网址测试下vps网络速度: h ...

  3. 第十章:Javascript子集和扩展

    本章讨论javascript的集和超集,其中子集的定义大部分处于安全考虑.只有使用这门语言的一个安全的子集编写脚本,才能让代码执行的更安全.更稳定.ECMScript3标准是1999年版本的,10年后 ...

  4. 'UserInfoBLL' node cannot be resolved for the specified context [MVC展示数据.Controllers.LoginController]问题解决

    我们在配置Spring.Net时,往往会提示找不到,然而看了看都对着呢?那么问题出在了哪? 问题呈现: 进行如下修改,将名字随便取个,不为BLL方法名字即可,我这里添加了一个1,注意这里改了,控制器里 ...

  5. css学习归纳总结

    来源于:trigkit4 css学习归纳总结(一) 选择器的分组 CSS选择器分为 1.群组选择器 如:p, body, img, div{} 2.兄弟选择器 如:p + p { color:#f00 ...

  6. ASP.NET加JS方式

    一.如果是asp.net中的控件有OnClientClick事件,可以在控件中直接加 OnClientClick--客户端点击事件 二.如果asp.net中的控件没有OnClientClick事件,可 ...

  7. unicode和gbk的互相转换

    unicode和gbk的互相转换主要依靠window下的escape和unescape方法,然后把%u替换成\u就好了; var GB2312UnicodeConverter = { ToUnicod ...

  8. html5_canvas-记忆力卡片游戏

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. Informatica 错误:Cannot convert from SQL type 93 to C type 4

    经验和积累蛮重要!向大神学习! ---------------------------------------------------------------------- Mapping: 在sou ...

  10. ZOJ 2110 Tempter of the Bone

    Tempter of the Bone Time Limit: 2 Seconds      Memory Limit: 65536 KB The doggie found a bone in an ...