js对象的定义方法

转载:http://blog.sina.com.cn/s/blog_60f632050100wz7h.html


(1)基于已有对象的扩充方法:适用于临时构建对象,弊端:每次构建对象都要新建一个。

 var object=new Object();

    object.name="Tom";
    object.sayname=function(name)
    {
        this.name=name;
        alert(this.name);
    }

    object.sayname("James");


(2)工厂方法 :可以重复返回多个对象。

    function createObject(){
    
        var object=new Object();
        object.username="Tom";
        object.password="123";
        object.get=function(){
            alert(this.username+","+this.password);
        }

        return object;
    }

    var o1=createObject();
    var o2=createObject();
    o2.username="james";
    o1.get();
    o2.get();


工厂方法的改进:

因为js的函数定义是指向一个应用的对象,所以每次构建一个object对象,都会构建一个get方法的对象,现在将get方法分离,那么就是多个object对象共用一个get对象,这样就可以节省内存空间。改进如下:
  function get(){
  alert(this.username+","+this.password);
}

  function createObject(username,password){
    
        var object=new Object();
        object.username=username;
        object.password=password;
        object.get=get;

        return object;
    }
    var o1=createObject();
    var o2=createObject();
    o1.get();
    o2.get();


(3)构造方法创建对象:
<span style="white-space:pre">	</span>function getInfo(){
    <span style="white-space:pre">		</span>alert(this.username+","+this.password);
    <span style="white-space:pre">	</span>}
   
        function Person(username,password){
           //在执行第一行代码前,js引擎会生产一个对象。即浏览器
            this.username=username;
            this.password=password;
            this.getInfo=getInfo;
            //此处隐含了一个return object的语句。
       
        }
       //只有在使用new Person();才会有上述Person中注释出现的情况,如果不适用new语句是不会          //成功的。
        var person=new Person("Tom","abc");
        person.getInfo();
        var person2=new Person("Jame","123");
        person2.getInfo();

(4)原型方法:(prototype)
因为js的所有类都是继承Object,Object中有prototype属性,因此自定义的对象也有prototype属性:如下
    function Person(){}

    Person.prototype.username="Tom";
    Person.prototype.password="1325";

    Person.prototype.getInfor=function(){
        alert(this.username+" , "+this.password);
    }

    var person=new Person();
    var person2=new Person();
    person.username="James";
    person.getInfor();
    person2.getInfor();

这种方法的缺点就是不能传递参数,只能在创建后修改属性。另外使用这种方法定义的对象都贡献同样的属性,因为他们都共用了object对象中的prototype对象,所以所有的对象贡献原型中的属性,其中一个更改了属性,也会反映到其他对象中去。

为了解决原型方法中对象贡献属性,可以采用构造方法+原型的方法去构建对象。把属性用构造方法定好。具体方法就用原型设置。
如下:
    <script type="text/javascript">
   
        function  Person(password){
       
            this.username=new Array();
           
            this.password=password;
       
        }

        Person.prototype.getInfo=function(){
            alert(this.username+","+this.password);
        }
    var p1=new Person("abc");
    p1.username.push("Tom");
    p1.getInfo();
   
    </script>

(5)动态原型的方法:
    function Person(username,password){
       
        this.username=username;
        this.password=password;

        if( typeof Person.first=="undefined" ){//通过设置标志量让getInfo只生成一次对象。
       
            alert("invoke");

            Person.prototype.getInfo=function(){
                alert(this.username+" , " +this.password);
            }
        Person.first=true;
       
        }
   
    }

    var p1=new Person("Tom","123");   
    var p2=new Person("James","abc");
    p1.getInfo();
    p2.getInfo();


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值