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 相关文章推荐
使用JavaScript检测Firefox浏览器是否启用了Firebug的代码
Dec 28 Javascript
jQuery中绑定事件的命名空间详解
Apr 05 Javascript
JSON语法五大要素图文介绍
Dec 04 Javascript
JS判断不能为空实例代码
Nov 26 Javascript
js代码验证手机号码和电话号码是否合法
Jul 30 Javascript
js提交form表单,并传递参数的实现方法
May 25 Javascript
javascript类型系统——日期Date对象全面了解
Jul 13 Javascript
js动态生成form 并用ajax方式提交的实现方法
Sep 09 Javascript
jquery在启动页面时,自动加载数据的实例
Jan 22 jQuery
Vue项目引进ElementUI组件的方法
Nov 11 Javascript
Vue的路由及路由钩子函数的实现
Jul 02 Javascript
微信小程序8种数据通信的方式小结
Feb 03 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
复杂检索数据并分页显示的处理方法
2006/10/09 PHP
Thinkphp中的curd应用实用要点
2015/01/04 PHP
Javascript将string类型转换int类型
2010/12/09 Javascript
基于JQuery实现的Select级联
2014/01/27 Javascript
jQuery实现当按下回车键时绑定点击事件
2014/01/28 Javascript
基于Jquery+Ajax+Json实现分页显示附效果图
2014/07/30 Javascript
JavaScript实现的内存数据库LokiJS介绍和入门实例
2014/11/17 Javascript
jQuery中unbind()方法用法实例
2015/01/19 Javascript
利用JavaScript脚本实现滚屏效果的方法
2015/07/07 Javascript
JavaScript的函数式编程基础指南
2016/03/19 Javascript
JS组件系列之Bootstrap table表格组件神器【二、父子表和行列调序】
2016/05/10 Javascript
video.js使用改变ui过程
2017/03/05 Javascript
如何使用Bootstrap 按钮实例详解
2017/03/29 Javascript
带你快速理解javascript中的事件模型
2017/08/14 Javascript
详解使用nvm管理多版本node的方法
2017/08/30 Javascript
从源码看angular/material2 中 dialog模块的实现方法
2017/10/18 Javascript
bootstrap中selectpicker下拉框使用方法实例
2018/03/22 Javascript
解决vue-cli项目开发运行时内存暴涨卡死电脑问题
2019/10/29 Javascript
python合并文本文件示例
2014/02/07 Python
Python深入学习之装饰器
2014/08/31 Python
浅谈Python中的zip()与*zip()函数详解
2018/02/24 Python
python实现寻找最长回文子序列的方法
2018/06/02 Python
python实现全盘扫描搜索功能的方法
2019/02/14 Python
详解如何使用Pytest进行自动化测试
2021/01/14 Python
详解HTML5 canvas绘图基本使用方法
2018/01/29 HTML / CSS
沙龙级头发造型工具:FOXYBAE
2018/07/01 全球购物
学校消防安全制度
2014/01/30 职场文书
合作协议书范本
2014/04/17 职场文书
中药学专业求职信
2014/05/31 职场文书
学习焦裕禄同志为人民服务思想汇报
2014/09/10 职场文书
教育合作协议范本
2014/10/17 职场文书
医生辞职信范文
2015/03/02 职场文书
党员干部廉政承诺书
2015/04/28 职场文书
2015年高校教师个人工作总结
2015/05/25 职场文书
2019年圣诞节祝福语集锦
2019/12/25 职场文书
python中 Flask Web 表单的使用方法
2022/05/20 Python