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 常见操作实现方式和常用函数方法总结
May 06 Javascript
表格单元格交错着色实现思路及代码
Apr 01 Javascript
阻止事件(取消浏览器对事件的默认行为并阻止其传播)
Nov 03 Javascript
100个不能错过的实用JS自定义函数
Mar 05 Javascript
JavaScript通过正则表达式实现表单验证电话号码
Mar 07 Javascript
完美JQuery图片切换效果的简单实现
Jul 21 Javascript
详解Angular5 路由传参的3种方法
Apr 28 Javascript
详解如何解决vue开发请求数据跨域的问题(基于浏览器的配置解决)
Nov 12 Javascript
vue.js的双向数据绑定Object.defineProperty方法的神奇之处
Jan 18 Javascript
js中!和!!的区别与用法
May 09 Javascript
js+canvas实现刮刮奖功能
Sep 13 Javascript
JavaScript仿京东轮播图效果
Feb 25 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模拟socket一次连接,多次发送数据的实现代码
2011/07/26 PHP
不支持fsockopen但支持culr环境下下ucenter与modoer通讯问题
2011/08/12 PHP
PHP 基于文件头的文件类型验证类函数
2012/05/01 PHP
PHP队列场景以及实现代码实例详解
2021/02/26 PHP
JavaScript CSS修改学习第二章 样式
2010/02/19 Javascript
关于js内存泄露的一个好例子
2013/12/09 Javascript
jquery实现背景墙聚光灯效果示例分享
2014/03/02 Javascript
document.compatMode的CSS1compat使用介绍
2014/04/03 Javascript
node.js中的fs.readdir方法使用说明
2014/12/17 Javascript
jQuery简单实现日历的方法
2015/05/04 Javascript
javascript实现带下拉子菜单的导航菜单效果
2015/05/14 Javascript
js+html5实现canvas绘制圆形图案的方法
2015/06/05 Javascript
Eclipse编辑jsp、js文件时卡死现象的解决办法汇总
2016/02/02 Javascript
使用AJAX实现Web页面进度条的实例分享
2016/05/06 Javascript
将html页面保存成图片,图片写入pdf的实现方法(推荐)
2016/09/17 Javascript
深入理解Node.js的HTTP模块
2016/10/12 Javascript
JavaScript创建对象的常用方式总结
2018/08/10 Javascript
ajaxfileupload.js实现上传文件功能
2019/04/19 Javascript
JavaScript setInterval()与setTimeout()计时器
2019/12/27 Javascript
webpack中的模式(mode)使用详解
2020/02/20 Javascript
Element Alert警告的具体使用方法
2020/07/27 Javascript
在vue中嵌入外部网站的实现
2020/11/13 Javascript
浅谈python中np.array的shape( ,)与( ,1)的区别
2018/06/04 Python
pandas.read_csv参数详解(小结)
2019/06/21 Python
python pytest进阶之conftest.py详解
2019/06/27 Python
python 用户交互输入input的4种用法详解
2019/09/24 Python
Tensorflow轻松实现XOR运算的方式
2020/02/03 Python
Python字典添加,删除,查询等相关操作方法详解
2020/02/07 Python
python redis存入字典序列化存储教程
2020/07/16 Python
Python制作一个仿QQ办公版的图形登录界面
2020/09/22 Python
北美大型运动类产品商城:Champs Sports
2017/01/12 全球购物
优秀团支部事迹材料
2014/02/08 职场文书
北京青年观后感
2015/06/15 职场文书
2016年小学生寒假总结
2015/10/10 职场文书
《怀念母亲》教学反思
2016/02/19 职场文书
vue项目两种方式实现竖向表格的思路分析
2021/04/28 Vue.js