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 相关文章推荐
JS无法捕获滚动条上的mouse up事件的原因猜想
Mar 21 Javascript
基于JQuery的类似新浪微博展示信息效果的代码
Jul 23 Javascript
js判断运行jsp页面的浏览器类型以及版本示例
Oct 30 Javascript
Jquery节点遍历next与nextAll方法使用示例
Jul 22 Javascript
JavaScript对数组进行随机重排的方法
Jul 22 Javascript
跟我学习javascript的异步脚本加载
Nov 20 Javascript
浅谈Node.js 子进程与应用场景
Jan 24 Javascript
vue地区选择组件教程详解
May 04 Javascript
微信小程序实现3D轮播图效果(非swiper组件)
Sep 21 Javascript
微信小程序实现页面浮动导航
Jan 08 Javascript
在vue项目中封装echarts的步骤
Dec 25 Vue.js
AJAX学习笔记
May 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去除数组中重复的元素并按键名排序函数
2008/08/18 PHP
两个强悍的php 图像处理类1
2009/06/15 PHP
使用PHP生成二维码的两种方法(带logo图像)
2014/03/14 PHP
Yii2.0中的COOKIE和SESSION用法
2016/08/12 PHP
PHP实现十进制、二进制、八进制和十六进制转换相关函数用法分析
2017/04/25 PHP
基础的prototype.js常用函数及其用法
2007/03/10 Javascript
javascript事件冒泡和事件捕获详解
2015/05/26 Javascript
Bootstrap每天必学之弹出框(Popover)插件
2016/04/25 Javascript
Angular+Node生成随机数的方法
2017/06/16 Javascript
Vue-cropper 图片裁剪的基本原理及思路讲解
2018/04/17 Javascript
深入浅析AngularJs模版与v-bind
2018/07/06 Javascript
JavaScript制作3D旋转相册
2020/08/02 Javascript
Vue(定时器)解决mounted不能获取到data中的数据问题
2020/07/30 Javascript
[48:45]Ti4 循环赛第二日 NEWBEE vs EG
2014/07/11 DOTA
[49:12]完美世界DOTA2联赛PWL S2 Magma vs GXR 第二场 11.29
2020/12/02 DOTA
Python实现方便使用的级联进度信息实例
2015/05/05 Python
Python中的rjust()方法使用详解
2015/05/19 Python
python提取字典key列表的方法
2015/07/11 Python
Python简单的制作图片验证码实例
2017/05/31 Python
PYTHON基础-时间日期处理小结
2018/05/05 Python
Python网页正文转换语音文件的操作方法
2018/12/09 Python
在python中利用KNN实现对iris进行分类的方法
2018/12/11 Python
浅析PyTorch中nn.Module的使用
2019/08/18 Python
python 并发下载器实现方法示例
2019/11/22 Python
keras中的卷积层&池化层的用法
2020/05/22 Python
css3 伪类选择器快速复习小结
2019/09/10 HTML / CSS
Shoes For Crews法国官网:美国领先的防滑鞋设计和制造商
2018/01/01 全球购物
意大利值得信赖的在线超级药房:PillolaStore
2020/02/05 全球购物
Ado与Ado.net的相同与不同
2014/12/08 面试题
外贸英语毕业生自荐信
2013/11/14 职场文书
民主生活会主持词
2015/07/01 职场文书
2015年支教教师工作总结
2015/07/22 职场文书
总结Python使用过程中的bug
2021/06/18 Python
python之django路由和视图案例教程
2021/07/26 Python
python标准库ElementTree处理xml
2022/05/20 Python
html中两种获取标签内的值的方法
2022/06/16 jQuery