js中定义对象的几种方式

时间:2022-04-14 14:41:29

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

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

  1. var object=new Object();
  2. object.name="Tom";
  3. object.sayname=function(name)
  4. {
  5. this.name=name;
  6. alert(this.name);
  7. }
  8. object.sayname("James");

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

  1. function createObject(){
  2. var object=new Object();
  3. object.username="Tom";
  4. object.password="123";
  5. object.get=function(){
  6. alert(this.username+","+this.password);
  7. }
  8. return object;
  9. }
  10. var o1=createObject();
  11. var o2=createObject();
  12. o2.username="james";
  13. o1.get();
  14. o2.get();

工厂方法的改进:

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

  1. function get(){
  2. alert(this.username+","+this.password);
  3. }
  4. function createObject(username,password){
  5. var object=new Object();
  6. object.username=username;
  7. object.password=password;
  8. object.get=get;
  9. return object;
  10. }
  11. var o1=createObject();
  12. var o2=createObject();
  13. o1.get();
  14. o2.get();

(3)构造方法创建对象:

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

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

  1. function Person(){}
  2. Person.prototype.username="Tom";
  3. Person.prototype.password="1325";
  4. Person.prototype.getInfor=function(){
  5. alert(this.username+" , "+this.password);
  6. }
  7. var person=new Person();
  8. var person2=new Person();
  9. person.username="James";
  10. person.getInfor();
  11. person2.getInfor();

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

为了解决原型方法中对象贡献属性,可以采用构造方法+原型的方法去构建对象。把属性用构造方法定好。具体方法就用原型设置。
如下:

  1. <script type="text/javascript">
  2. function  Person(password){
  3. this.username=new Array();
  4. this.password=password;
  5. }
  6. Person.prototype.getInfo=function(){
  7. alert(this.username+","+this.password);
  8. }
  9. var p1=new Person("abc");
  10. p1.username.push("Tom");
  11. p1.getInfo();
  12. </script>

(5)动态原型的方法:

    1. function Person(username,password){
    2. this.username=username;
    3. this.password=password;
    4. if( typeof Person.first=="undefined" ){//通过设置标志量让getInfo只生成一次对象。
    5. alert("invoke");
    6. Person.prototype.getInfo=function(){
    7. alert(this.username+" , " +this.password);
    8. }
    9. Person.first=true;
    10. }
    11. }
    12. var p1=new Person("Tom","123");
    13. var p2=new Person("James","abc");
    14. p1.getInfo();
    15. p2.getInfo();