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 相关文章推荐
IE php关于强制下载文件的代码
Aug 23 Javascript
Javascript中的作用域和上下文深入理解
Jul 03 Javascript
JavaScript实现仿新浪微博大厅和腾讯微博首页滚动特效源码
Sep 15 Javascript
JavaScript简单实现弹出拖拽窗口(一)
Jun 17 Javascript
Angularjs添加排序查询功能的实例代码
Oct 24 Javascript
C#实现将一个字符转换为整数
Dec 12 Javascript
Vue打包后出现一些map文件的解决方法
Feb 13 Javascript
解决vue keep-alive 数据更新的问题
Sep 21 Javascript
Vue 表情包输入组件的实现代码
Jan 21 Javascript
vue实现文字加密功能
Sep 27 Javascript
vue如何在项目中调用腾讯云的滑动验证码
Jul 15 Javascript
如何构建一个Vue插件并生成npm包
Oct 26 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
IIS安装Apache伪静态插件的具体操作图文
2013/07/01 PHP
PHP数组式访问接口ArrayAccess用法分析
2017/12/28 PHP
PHP基于进程控制函数实现多线程
2020/12/09 PHP
页面js遇到乱码问题的解决方法是和无法转码的情况
2014/04/30 Javascript
jquery用data方法获取某个元素上的事件
2014/06/23 Javascript
JS制作简单的三级联动
2015/03/18 Javascript
浅谈JavaScript的Polymer框架中的behaviors对象
2015/07/29 Javascript
用JavaScript获取页面文档内容的实现代码
2016/06/10 Javascript
BootStrap Fileinput上传插件使用实例代码
2017/07/28 Javascript
基于canvas粒子系统的构建详解
2017/08/31 Javascript
vue中eventbus被多次触发以及踩过的坑
2017/12/02 Javascript
ES6学习笔记之map、set与数组、对象的对比
2018/03/01 Javascript
详解React中setState回调函数
2018/06/14 Javascript
详解如何使用router-link对象方式传递参数?
2019/05/02 Javascript
javascript设计模式 ? 适配器模式原理与应用实例分析
2020/04/13 Javascript
react 不用插件实现数字滚动的效果示例
2020/04/14 Javascript
JavaScript实现下拉列表
2021/01/20 Javascript
[02:51]DOTA2英雄基础教程 风暴之灵
2013/12/23 DOTA
python使用PyGame模块播放声音的方法
2015/05/20 Python
Python通过select实现异步IO的方法
2015/06/04 Python
python中的随机函数random的用法示例
2018/01/27 Python
使用Python制作表情包实现换脸功能
2019/07/19 Python
pandas数据选取:df[] df.loc[] df.iloc[] df.ix[] df.at[] df.iat[]
2020/04/24 Python
使用python实现CGI环境搭建过程解析
2020/04/28 Python
分享29个基于Bootstrap的HTML5响应式网页设计模板
2015/11/19 HTML / CSS
Club Monaco加拿大官网:设计师男女服装
2019/09/29 全球购物
乐观自信演讲稿范文
2014/05/21 职场文书
专题组织生活会思想汇报
2014/10/01 职场文书
2015年社区服务活动总结
2015/03/25 职场文书
土木工程生产实习心得体会
2016/01/22 职场文书
社区结对共建协议书
2016/03/23 职场文书
社交电商模式的兴起:这些新的商机千万别错过
2019/07/26 职场文书
python 调用js的四种方式
2021/04/11 Python
通过shell脚本对mysql的增删改查及my.cnf的配置
2021/07/07 MySQL
Web应用开发TypeScript使用详解
2022/05/25 Javascript
微信小程序实现轮播图指示器
2022/06/25 Javascript