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 刷新框架页的代码
Apr 13 Javascript
js中如何复制一个对象并获取其所有属性和属性对应的值
Oct 24 Javascript
js几秒以后倒计时跳转示例
Dec 26 Javascript
Web前端新人笔记之jquery入门心得(新手必看)
May 17 Javascript
artDialog+plupload实现多文件上传
Jul 19 Javascript
JS无缝滚动效果实现方法分析
Dec 21 Javascript
javascript 面向对象function详解及实例代码
Feb 28 Javascript
Angular2.js实现表单验证详解
Jun 23 Javascript
微信小程序上传图片实例
May 28 Javascript
Javascript前端下载后台传来的文件流代码实例
Aug 18 Javascript
vue下载二进制流图片操作
Oct 26 Javascript
几款主流好用的富文本编辑器(所见即所得常用编辑器)介绍
Mar 17 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 SPL标准库之接口(Interface)详解
2015/05/11 PHP
PHP5.3新特性小结
2016/02/14 PHP
PHP htmlspecialchars() 函数实例代码及用法大全
2018/09/18 PHP
Sample script that displays all of the users in a given SQL Server DB
2007/06/16 Javascript
三级下拉菜单的js实现代码
2011/05/23 Javascript
关于jQuery的inArray 方法介绍
2011/10/08 Javascript
A标签中通过href和onclick传递的this对象实现思路
2013/04/19 Javascript
JS实现购物车特效
2017/02/02 Javascript
fckeditor部署到weblogic出现xml无法读取及样式不能显示问题的解决方法
2017/03/24 Javascript
node.js 核心http模块,起一个服务器,返回一个页面的实例
2017/09/11 Javascript
jQuery基于cookie实现换肤功能实例
2017/10/14 jQuery
微信小程使用swiper组件实现图片轮播切换显示功能【附源码下载】
2017/12/12 Javascript
vue-cli脚手架搭建的项目去除eslint验证的方法
2018/09/29 Javascript
mongodb初始化并使用node.js实现mongodb操作封装方法
2019/04/02 Javascript
python利用datetime模块计算时间差
2015/08/04 Python
深入解析Python中的list列表及其切片和迭代操作
2016/03/13 Python
python将ansible配置转为json格式实例代码
2017/05/15 Python
Python操作Oracle数据库的简单方法和封装类实例
2018/05/07 Python
浅谈Python里面小数点精度的控制
2018/07/16 Python
Python同步遍历多个列表的示例
2019/02/19 Python
python面试题小结附答案实例代码
2019/04/11 Python
python修改微信和支付宝步数的示例代码
2020/10/12 Python
selenium+超级鹰实现模拟登录12306
2021/01/24 Python
IWOOT美国:新奇的小玩意
2018/04/27 全球购物
英国在线女鞋目的地:SIMMI
2018/12/27 全球购物
浙大网新C/C++面试解惑
2015/05/27 面试题
C#如何允许一个类被继承但是避免这个类的方法被重载?
2015/02/24 面试题
运动会广播稿60字
2014/01/15 职场文书
大学毕业感言100字
2014/02/03 职场文书
机电职业生涯规划书范文
2014/03/08 职场文书
党的群众路线教育实践活动总结报告
2014/07/03 职场文书
小学生田径运动会广播稿
2014/09/11 职场文书
意外伤害赔偿协议书
2014/09/16 职场文书
天下第一关导游词
2015/02/06 职场文书
企业投资意向书
2015/05/09 职场文书
Oracle使用别名的好处
2022/04/19 Oracle