当前位置: 首页 > 图文教程 > 网络编程 > Javascript > javascript Prototype 对象扩展

Javascript
可实现多表单提交的javascript函数
比较详细的关于javascript中void(0)的具体含义解释
随机显示经典句子或诗歌的javascript脚本
javascript实现的多条新闻公告系统
解析arp病毒背后利用的Javascript技术附解密方法
比较详细的javascript对象的property和prototype是什么一种关系
访问百度和谷歌网速测试的javascript代码
javascript 动态改变层的Z-INDEX的代码style.zIndex
javascript+css实现单击颜色褪去效果
javascript 表单日期选择效果
比较简单的javascript实现input双击后可以编辑
javascript实现的颜色块滑动的动态效果
js实现网页检测是否安装了 Flash Player 插件
javascript 实现父窗口引用弹出窗口的值的脚本
javascript 实现双击才能打开链接的方法
用javascript实现兼容IE7的类库 IE7_0_9.zip提供下载
document.createElement("A")比较不错的属性
用javascript实现不按Ctrl实现Multiple Select多选
JavaScript-世界上误解最深的语言分析
IE和Mozilla的兼容性汇总event

Javascript 中的 javascript Prototype 对象扩展


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-12   浏览: 343 ::
收藏到网摘: n/a

从对象创建一个实例说起来貌似是很简单的东西,是啊,基本在所有的语言中,都是用new关键字来创建实例的 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]);
}