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

Javascript
javascript 新浪背投广告实现代码
javascript 选择文件夹对话框(web)
JS 自动完成 AutoComplete(Ajax 查询)
javascript scrollLeft,scrollWidth,clientWidth,offsetWidth 完全详解
jQuery 插件开发 其实很简单
最简单的jQuery程序 入门者学习
javascript 读取xml,写入xml 实现代码
JQuery 实现的页面滚动时浮动窗口控件
javascript 动态加载 css 方法总结
javascript 表格左右收缩
jqurey 学习笔记 传智博客佟老师附详细注释
javascript dom 操作详解 js加强
JS 动态添加列表框项效果代码
Javascript 事件流和事件绑定
Google Map Api和GOOGLE Search Api整合实现代码
9个javascript语法高亮插件 推荐
Prototype String对象 学习
javascript ImgBox透明遮罩层背景图片展示
javascript FAQ函数(提问+回复)
jQuery TextBox自动完成条

Javascript 中的 javascript Prototype 对象扩展


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-12   浏览: 385 ::
收藏到网摘: 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]);
}