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 相关文章推荐
通过隐藏option实现select的联动效果
Nov 10 Javascript
onclick与listeners的执行先后问题详细解剖
Jan 07 Javascript
javascript事件模型实例分析
Jan 30 Javascript
js使用setTimeout实现定时炸弹的方法
Apr 10 Javascript
javascript常用方法总结
May 14 Javascript
AngularJS中的Directive自定义一个表格
Jan 25 Javascript
基于JS脚本语言的基础语法详解
Jul 22 Javascript
VueJs组件prop验证简单介绍
Sep 12 Javascript
JS实现提交表单前的数字及邮箱校检功能
Nov 13 Javascript
Vue.js中 v-model 指令的修饰符详解
Dec 03 Javascript
JavaScript this使用方法图解
Feb 04 Javascript
JS写滑稽笑脸运动效果
May 28 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伪造来源HTTP_REFERER的方法实例详解
2015/07/06 PHP
JavaScript+CSS控制打印格式示例介绍
2014/01/07 Javascript
chrome下img加载对height()的影响示例探讨
2014/05/26 Javascript
js父页面与子页面不同时显示的方法
2014/10/16 Javascript
详谈jQuery中的this和$(this)
2014/11/13 Javascript
Angularjs 基础入门
2014/12/26 Javascript
JavaScript基于setTimeout实现计数的方法
2015/05/08 Javascript
简介JavaScript中valueOf()方法的使用
2015/06/05 Javascript
jQuery实现的网页右下角tab样式在线客服效果代码
2015/10/23 Javascript
完美实现八种js焦点轮播图(下篇)
2020/04/20 Javascript
微信小程序 swiper组件轮播图详解及实例
2016/11/16 Javascript
jquery插件ContextMenu设置右键菜单
2017/03/13 Javascript
vue动态改变背景图片demo分享
2018/09/13 Javascript
解决Layui数据表格显示无数据提示的问题
2019/11/14 Javascript
mapboxgl实现带箭头轨迹线的代码
2021/01/04 Javascript
python目录操作之python遍历文件夹后将结果存储为xml
2014/01/27 Python
Python实现的批量下载RFC文档
2015/03/10 Python
给Python入门者的一些编程建议
2015/06/15 Python
使用Python中的tkinter模块作图的方法
2017/02/07 Python
利用Python暴力破解zip文件口令的方法详解
2017/12/21 Python
python之DataFrame实现excel合并单元格
2021/02/22 Python
python sys.argv[]用法实例详解
2018/05/25 Python
python多线程并发让两个LED同时亮的方法
2019/02/18 Python
python爬虫 模拟登录人人网过程解析
2019/07/31 Python
Python内置数据类型list各方法的性能测试过程解析
2020/01/07 Python
TensorFlow绘制loss/accuracy曲线的实例
2020/01/21 Python
Python连接mysql方法及常用参数
2020/09/01 Python
详解Html5微信支付爬坑之路
2018/07/24 HTML / CSS
Bose英国官方网站:美国知名音响品牌
2020/01/26 全球购物
美国价格实惠的在线眼镜网站:Zeelool
2020/12/25 全球购物
法学毕业生自荐信
2013/11/13 职场文书
初中语文教学反思
2014/02/02 职场文书
大学新闻系应届生求职信
2014/06/02 职场文书
企业宗旨标语
2014/06/10 职场文书
Python中OpenCV实现简单车牌字符切割
2021/06/11 Python
Linux中文件的基本属性介绍
2022/06/01 Servers