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]);
}

相关文章

  • uniapp中canvas绘制图片内容空白报错的原因及解决

    uniapp中canvas绘制图片内容空白报错的原因及解决

    最近有个需求就是要用canvas画个分享的海报,所以这里总结下,这篇文章主要给大家介绍了关于uniapp中canvas绘制图片内容空白报错的原因及解决方法,需要的朋友可以参考下
    2023-09-09
  • JS实现带有3D立体感的银灰色竖排折叠菜单代码

    JS实现带有3D立体感的银灰色竖排折叠菜单代码

    这篇文章主要介绍了JS实现带有3D立体感的银灰色竖排折叠菜单代码,可实现基本的JS响应鼠标事件动态展开与折叠菜单栏的功能,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • js实现滑动到页面底部自动加载更多功能

    js实现滑动到页面底部自动加载更多功能

    本文主要分享了js实现滑动到页面底部自动加载更多功能的代码。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • js实现window.open不被拦截的解决方法汇总

    js实现window.open不被拦截的解决方法汇总

    这篇文章主要介绍了js实现window.open不被拦截的解决方法,实例汇总了常用的不被拦截的解决方法,需要的朋友可以参考下
    2014-10-10
  • JavaScript使用表单元素验证表单的示例代码

    JavaScript使用表单元素验证表单的示例代码

    这篇文章主要介绍了JavaScript使用表单元素验证表单的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • js和html5实现手机端刮刮卡抽奖效果完美兼容android/IOS

    js和html5实现手机端刮刮卡抽奖效果完美兼容android/IOS

    手机完美支持html5,所以如果手机端想要做个抽奖模块的话,用刮刮卡抽奖效果,相信这个互动体验是非常棒的,本人亲自完成,有错误请大家指出
    2013-11-11
  • JS数组方法push()、pop()用法实例分析

    JS数组方法push()、pop()用法实例分析

    这篇文章主要介绍了JS数组方法push()、pop()用法,结合实例形式分析了JavaScript数组push()与pop()方法基本功能、原理、使用方法与操作注意事项,需要的朋友可以参考下
    2020-01-01
  • JS 图片压缩原理与实现方法详解

    JS 图片压缩原理与实现方法详解

    这篇文章主要介绍了JS 图片压缩原理与实现方法,结合实例形式详细分析了JS 图片压缩原理、实现方法与操作注意事项,需要的朋友可以参考下
    2020-04-04
  • jsp 自动编译机制详细介绍

    jsp 自动编译机制详细介绍

    这篇文章主要介绍了 Jasper的自动检测实现的机制比较简单,依靠某后台线程不断检测JSP文件与编译后的class文件的最后修改时间是否相同,若相同则认为没有改动,但倘若不同则需要重新编译,需要的朋友可以参考下
    2016-12-12
  • js使弹层下面的body禁止滚动

    js使弹层下面的body禁止滚动

    这篇文章介绍了js使弹层下面body禁止滚动的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06

最新评论