JavaScript学习笔记之创建对象

来源:互联网 发布:印度人是黄种人吗 知乎 编辑:程序博客网 时间:2024/05/01 17:06

        一、创建自定义对象最简单的方式就是创建一个object实例,然后为它添加属性和方法。

var person=new Object();person.name="John";person.age=20;person.sayName=function(){       alert(this.name);};
        

        二、通过对象字面量进行定义。

var person={      name:"John",      age:20,      sayName:function(){            alert(this.name);      }};

        三、工厂模式

function createPerson(name,age){      var o=new Object();      o.name=name;      o.age=age;      o.sayName=function(){            alert(this.name);      };      return o;}var person1=createPerson("John",20);var person2=createPerson("Mike",25);
       优点:解决了创建 多个相似对象的问题

       缺点:无法知道一个对象实例的具体类型

        四、构造函数模式

function Person(name,age){      this.name=name;      this.age=age;      this.sayName=function(){            alert(this.name);      };}var person1=new Person("John",20);var person2=new Person("Mike",25);
        优点:较之工厂模式,可以识别对象的具体类型(instanceof)。

        缺点:每个方法都要在每个实例上重新创建一遍,每个Person实例都包含一个不同的function实例(函数的作用域链和标识符解析都不同),无法实现方法的共享。
        五、原型模式

function Person(){}Person.prototype.name="John";Person.prototype.age=20;Person.prototype.sayName=function(){      alert(this.name);};var person1=new Person();person1.sayName();   //"John"var person2=new Person();person2.sayName();   //"John"alert(person1.sayName==person2.sayName);   //true

        更简单的原型模式

function Person(){}Person.prototype={      constructor:Person,      name:"John",      age:20,      sayName:function(){           alert(this.name);     }};
        优点:可以让所有对象实例共享它所包含的属性和方法。

        缺点:无法拥有独立的引用类型属性。没有为构造函数传递初始化参数,使得所有实例在默认情况下都取得相同的属性值。

        六、组合使用构造函数模式和原型模式

function Person(name,age){      this.name=name;      this.age=age;      this.friends=["Kevin","Jason"];}Person.prototype={      constructor:Person,      sayName:function(){            alert(this.name);      }};var person1=new Person("John",20);var person2=new Person("Mike",25);person1.friends.push("Van");alert(person1.friends);   //"Kevin,Jason,Van"alert(person2.friends);   //"Kevin,Jason"alert(person1.sayName===person2.sayName);   //true

        这是定义应用类型的一种默认模式。





0 0