javascript Prototype 对象扩展


Posted in Javascript onMay 15, 2009

Javascript当然也不例外,可是关于对象的引用问题,你考虑过么?通常的做法是一系列对象共享类的方法,而不是为每个对象复制一份函数。下面看看为每个对象复制一份函数的做法。

var myobject=function(param1,param2) 
{ 
this.name=param1; 
this.age=param2; 
this.showmsg=function() 
{ 
alert("name:"+this.name+"\n"+"age:"+this.age); 
} 
} 
var objectone=new myobject('liu',20); 
alert(objectone.name); //liu 
var objecttwo=new myobject('lin',20); 
alert(objecttwo.name); //lin 
alert(objecttwo.showmsg()); 
var objectthree=new myobject('lhking',22); 
alert(objectthree.showmsg());

看起来不错,用起来也不错,对象之间互相没有任何干扰,也能正常完成工作,一切看起来理所当然,但是你每次产生一个新对象的时候,脚本引擎都会给对象复制一份属性和方法,有没有觉得这样很浪费内存呢?在客户端的这种对象的复制方式,极其容易造成内存泄露,因为每次产生新的实例都会复制所有的属性和方法,占用大量的内存。
在大型JavaScript应用中首先考虑的就是内存问题。
正确的使用方法是用prototype关键字来定义一个类的方法或者属性
var myobject=function(param1,param2) 
{ 
this.name=param1; 
this.age=param2; 
myobject.prototype.showmsg=function() 
{ 
alert("name:"+this.name+"\n"+"age:"+this.age); 
} 
} 
var objectone=new myobject('liu',20); 
alert(objectone.name); 
var objecttwo=new myobject('lin',20); 
alert(objecttwo.name); 
alert(objecttwo.showmsg()); 
var objectthree=new myobject('lhking',22); 
alert(objectthree.showmsg);

这样的话,你创建的对象之间可以共用方法,也就是showmsg()函数只定义一次,其它的对象共用这一个方法,而不是复制出自己的方法。
Javascript中的prototype已经说完。

看看JavaScript中的对象扩展

function rand(x) 
{ 
return Math.ceil(Math.random()*x); 
} 
生成随机数组的一个扩展方法 
Array.prototype.random=function() 
{ 
for(var i=(this.length-1);i>1;i--) 
{ 
var j=rand(this.length-1); 
var cache=this[i]; 
this[i]=this[j]; 
this[j]=cache; 
} 
} 
var array=new Array("1","2","3","4","5"); 
for(var a in array) 
{ 
alert(array[a]); 
} 
array.random(); 
for(var b in array) 
{ 
alert(array[b]); 
}

再看看对象反射
反射是一种对象的机制,它允许你在完全不了解对象的情况下了解它的属性和方法,通常情况下,程序员对于自己所操纵的对象是如何组成的是非常了解的,但是在某些特殊情况下使用某个其他人写的复杂的对象的时候,我们需要快速了解这个对象的属性和方法,就需要用到反射的机制,当然反射的应用并不是局限于此,这里只是介绍反射在Javascript中的使用方法.

首先我们可能想知道在某个对象中是否存在一个特定的属性或者方法,这时候我们可以地测试它:
if(typeof(myobject.someproperty)!="undefined")
{
}
在Javascript中如果没有定义一个对象或者变量的话,它总是返回undefined类型.
也可以用其他的内建类来缩小测试范围:
if(myobject instanceof Object)
{
}
instanceof 是用来测试内建类或者自定义类的操作符,内建类指Array,String,Date,Number,Math,RegExp,Boolean,Function之类的内建类.例如:Function和Array都是继承自Object类的,所以如果你在代码中如果测试某个Array对象的话,如果你先测试它是否是Object,将返回true,如果测试它是否是Array的话,它也会返回true。

一个更简单而有用的方法,是遍历一个对象的所有属性和方法来快速了解一个对象的内部状态:

function myobject(){ 
this.name="name"; 
this.age="age"; 
this.sex="sex"; 
this.func=function(){ 
} 
} 
var myobj=new myobject(); 
for(var i in myobj){ 
alert(myobj[i]); 
}
Javascript 相关文章推荐
jquery提升性能最佳实践小结
Dec 06 Javascript
修改好的jquery滚动字幕效果实现代码
Jun 22 Javascript
JavaScript中this关键词的使用技巧、工作原理以及注意事项
May 20 Javascript
AngularJS初始化过程分析(引导程序)
Dec 06 Javascript
jQuery $.each遍历对象、数组用法实例
Apr 16 Javascript
javaScript实现滚动新闻的方法
Jul 30 Javascript
JavaScript中数组去除重复的三种方法
Apr 22 Javascript
JS代码实现百度地图 画圆 删除标注
Oct 12 Javascript
HTML5基于Tomcat 7.0实现WebSocket连接并实现简单的实时聊天
Oct 31 Javascript
vue双向绑定的简单实现
Dec 22 Javascript
JavaScript中的ES6 Proxy的具体使用
Jun 16 Javascript
JS实现简单控制视频播放倍速的实例代码
Apr 18 Javascript
JavaScript设置FieldSet展开与收缩
May 15 #Javascript
childNodes.length与children.length的区别
May 14 #Javascript
DOM下的节点属性和操作小结
May 14 #Javascript
JQuery textlimit 显示用户输入的字符数 限制用户输入的字符数
May 14 #Javascript
JavaScript 动态将数字金额转化为中文大写金额
May 14 #Javascript
JS面向对象、prototype、call()、apply()
May 14 #Javascript
JavaScript Date对象使用总结
May 14 #Javascript
You might like
PHP递归算法的简单实例
2019/02/28 PHP
JavaScript中关于indexOf的使用方法与问题小结
2010/08/05 Javascript
纯js实现div内图片自适应大小(已测试,兼容火狐)
2014/06/16 Javascript
JavaScript基础教程之alert弹出提示框实例
2014/10/16 Javascript
js实现点击链接后窗口缩小并居中的方法
2015/03/02 Javascript
js判断登陆用户名及密码是否为空的简单实例
2016/05/16 Javascript
结合代码图文讲解JavaScript中的作用域与作用域链
2016/07/05 Javascript
JavaScript设计模式之单体模式全面解析
2016/09/09 Javascript
AngularJS中scope的绑定策略实例分析
2017/10/30 Javascript
浅谈React深度编程之受控组件与非受控组件
2017/12/26 Javascript
详解Vue中使用Echarts的两种方式
2018/07/03 Javascript
重置Redux的状态数据的方法实现
2019/11/18 Javascript
JavaScript实现打砖块游戏
2020/02/25 Javascript
JS+Canvas实现五子棋游戏
2020/08/26 Javascript
Python标准库之sqlite3使用实例
2014/11/25 Python
Python StringIO模块实现在内存缓冲区中读写数据
2015/04/08 Python
Django Admin实现上传图片校验功能
2016/03/06 Python
Python标准库sched模块使用指南
2017/07/06 Python
利用python解决mysql视图导入导出依赖的问题
2017/12/17 Python
Python实现批量读取图片并存入mongodb数据库的方法示例
2018/04/02 Python
对python3中pathlib库的Path类的使用详解
2018/10/14 Python
python之生成多层json结构的实现
2020/02/27 Python
浅谈Python的方法解析顺序(MRO)
2020/03/05 Python
python二维图制作的实例代码
2020/12/03 Python
html5 video全屏播放/自动播放的实现示例
2020/08/06 HTML / CSS
全球速卖通俄罗斯站:AliExpress俄罗斯
2019/06/17 全球购物
Super-Pharm波兰:药房和香水在一个地方
2020/08/18 全球购物
阿尔卡特(中国)的面试题目
2014/08/20 面试题
《日月潭》教学反思
2014/02/28 职场文书
党的群众路线教育实践活动个人承诺书
2014/05/22 职场文书
个人违纪检讨书
2014/09/15 职场文书
农村党员对照检查材料
2014/09/24 职场文书
2014年秘书工作总结
2014/11/25 职场文书
国庆节慰问信
2015/02/15 职场文书
复试通知单模板
2015/04/24 职场文书
python 实现图与图之间的间距调整subplots_adjust
2021/05/21 Python