javascript Prototype 对象扩展

 更新时间:2009年05月15日 12:35:57   作者:  
从对象创建一个实例说起来貌似是很简单的东西,是啊,基本在所有的语言中,都是用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]);
}

相关文章

  • 详解JavaScript的原型与原型链

    详解JavaScript的原型与原型链

    这篇文章主要为大家详细介绍了JavaScript原型与原型链,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • js前端登录加密解决方案

    js前端登录加密解决方案

    项目中需要前端书写登录页面,用户输入账号密码,本文主要介绍了js前端登录加密解决方案,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • Js判断两个数组是否相等的几种常见场景

    Js判断两个数组是否相等的几种常见场景

    无论是在开发中还是面试时,在js中判断变量是否相等,都是一个比较常见的问题,这篇文章主要给大家介绍了关于Js判断两个数组是否相等的几种常见场景,需要的朋友可以参考下
    2024-07-07
  • 微信小程序单选框组应用详解

    微信小程序单选框组应用详解

    这篇文章主要为大家详细介绍了微信小程序单选框组应用,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • Webwork 实现文件上传下载代码详解

    Webwork 实现文件上传下载代码详解

    WebWork 当然也提供了很友好的拦截器来实现对文件的上传,让我们可以专注与业务逻辑的设计和实现,在实现上传和下载时顺便关注了下框架上传下载的实现
    2016-02-02
  • 教大家轻松制作Bootstrap漂亮表格(table)

    教大家轻松制作Bootstrap漂亮表格(table)

    这篇文章主要为大家详细介绍了Bootstrap轻松制作漂亮表格table的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • 如何在uniapp中获取可视区域的高度(uni.getSystemInfo)

    如何在uniapp中获取可视区域的高度(uni.getSystemInfo)

    这篇文章主要给大家介绍了关于如何在uniapp中获取可视区域的高度(uni.getSystemInfo)的相关资料,文中通过图文以及实例代码介绍的非常详细,对大家学习或者使用uniapp具有一定的参考学习价值,需要的朋友可以参考下
    2023-04-04
  • js Event对象的5种坐标

    js Event对象的5种坐标

    使用鼠标事件经常碰到这样的需求,比如获取鼠标相对于事件源的位置,鼠标相对于事件源对象父元素的位置
    2011-09-09
  • js键盘事件keydown事件、防止重复触发以及组合键的配合使用

    js键盘事件keydown事件、防止重复触发以及组合键的配合使用

    这篇文章主要给大家介绍了关于js键盘事件keydown事件、防止重复触发以及组合键配合使用的相关资料,文中通过代码介绍的非常详细,对大家的学习或者工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-04-04
  • JavaScript图片的Base64编码以及转换详解

    JavaScript图片的Base64编码以及转换详解

    现在网站为了提升用户的浏览体验越来越多的使用了图片,而这些图片通常以 Base64 的形式存储和加载,下面这篇文章主要给大家介绍了关于JavaScript图片的Base64编码以及转换的相关资料,需要的朋友可以参考下
    2022-07-07

最新评论