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操作对象数组的实现代码
Apr 27 Javascript
12款经典的白富美型—jquery图片轮播插件—前端开发必备
Jan 08 Javascript
JQuery 常用方法和事件详细介绍
Apr 18 Javascript
jquery parent和parents的区别分析
Oct 02 Javascript
JS实现让访问者自助选择网页文字颜色的方法
Feb 24 Javascript
javascript连续赋值问题
Jul 08 Javascript
this,this,再次讨论javascript中的this,超全面(经典)
Jan 05 Javascript
Easyui 之 Treegrid 笔记
Apr 29 Javascript
使用JS和canvas实现gif动图的停止和播放代码
Sep 01 Javascript
微信小程序实现点击按钮移动view标签的位置功能示例【附demo源码下载】
Dec 06 Javascript
在vue项目中使用Nprogress.js进度条的方法
Jan 31 Javascript
vue实现单一筛选、删除筛选条件
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
PHP,ASP.JAVA,JAVA代码格式化工具整理
2010/06/15 PHP
php Session无效分析资料整理
2016/11/29 PHP
详解php中serialize()和unserialize()函数
2017/07/08 PHP
让IE6支持min-width和max-width的方法
2010/06/25 Javascript
JQuery中的$.getJSON 使用说明
2011/03/10 Javascript
js控制的遮罩层实例介绍
2013/05/29 Javascript
ECMAScript6中Map/WeakMap详解
2015/06/12 Javascript
jQuery实现ctrl+enter(回车)提交表单
2015/10/19 Javascript
基于touch.js手势库+zepto.js插件开发图片查看器(滑动、缩放、双击缩放)
2016/11/17 Javascript
jQuery插件form-validation-engine正则表达式操作示例
2017/02/09 Javascript
Vue 2.0 服务端渲染入门介绍
2017/03/29 Javascript
微信小程序中的店铺评分组件及vue中用svg实现的评分显示组件
2018/11/16 Javascript
vue elementUI table表格数据 滚动懒加载的实现方法
2019/04/04 Javascript
详解微信图片防盗链“此图片来自微信公众平台 未经允许不得引用”的解决方案
2019/04/04 Javascript
微信小程序如何实现精确的日期时间选择器
2020/01/21 Javascript
如何使用vue slot创建一个模态框的实例代码
2020/05/24 Javascript
[00:32]10月24、25日 辉夜杯外卡赛附加赛开赛!
2015/10/23 DOTA
python实现360皮肤按钮控件示例
2014/02/21 Python
在java中如何定义一个抽象属性示例详解
2017/08/18 Python
python基本语法练习实例
2017/09/19 Python
Python从入门到精通之环境搭建教程图解
2019/09/26 Python
Python 3.8正式发布,来尝鲜这些新特性吧
2019/10/15 Python
使用python实现对元素的长截图功能
2019/11/14 Python
Django异步任务线程池实现原理
2019/12/17 Python
Python参数传递及收集机制原理解析
2020/06/05 Python
MATLAB数学建模之画图汇总
2020/07/16 Python
Django crontab定时任务模块操作方法解析
2020/09/10 Python
requests在python中发送请求的实例讲解
2021/02/17 Python
纯CSS3绘制打火机动画火焰效果
2016/07/18 HTML / CSS
Debenhams百货英国官方网站:Debenhams UK
2016/07/12 全球购物
巴西女装购物网站:Eclectic
2018/04/24 全球购物
德国便宜的宠物店:Brekz.de
2020/10/23 全球购物
利达恒信公司.NET笔试题面试题
2016/03/05 面试题
python re模块和正则表达式
2021/03/24 Python
单位作风建设自查报告
2014/10/23 职场文书
户外活动总结
2015/02/04 职场文书