JS Prototype

从对象创建一个实例说起来貌似是很简单的东西,是啊,基本在所有的语言中,都是用new关键字来创建实例的,Javascript当然也不例外,可是关于对象的引用问题,你考虑过么?通常的做法是一系列对象共享类的方法,而不是为每个对象复制一份函数。下面看看为每个对象复制一份函数的做法。

ContractedBlock.gifExpandedBlockStart.gifCode
           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关键字来定义一个类的方法或者属性

ContractedBlock.gifExpandedBlockStart.gifCode
            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中的对象扩展

ContractedBlock.gifExpandedBlockStart.gifCode
            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。

一个更简单而有用的方法,是遍历一个对象的所有属性和方法来快速了解一个对象的内部状态:

ContractedBlock.gifExpandedBlockStart.gifCode
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]);
}

PS:JS中的闭包

var abc = function(y) {
var x
= y; // 这个是局部变量
return function() {
alert(x
++); // 就是这里调用了闭包特性中的一级函数局部变量的x,并对它进行操作
alert(y--); // 引用的参数变量也是自由变量
}
} (
5); // 初始化
abc(); // "5" "5"
abc(); // "6" "4"
abc(); // "7" "3"
alert(x); // 报错!“x”未定义!

转载于:https://www.cnblogs.com/lhking/archive/2009/05/15/1457237.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值