在javascript中最简单的创建一个对象的方式如下:
var person = new Object(); person.name = "海绵宝宝"; person.age = 27; person.job = "software engineer"; person.sayName = function(){ alert(this.name); } person.sayName();
工厂模式,如下所示:
function createPerson (name,age,job){ var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function(){ alert(this.name); } return o; } var person = createPerson("Frederick",27,"software engineer"); person.sayName();
构造函数模式,如下所示:
function Person(name,age,job){ this.name = name; this.age = age; this.job = job; this.sayName = function(){ alert(this.name); } } var person1 = new Person("海绵宝宝",27,"software engineer"); var person2 = new Person("Frederick","29","Manager"); person1.sayName();//海绵宝宝 person2.sayName();//Frederick
上面的构造函数模式有个缺点,每个方法都要在创建每个实例时重新创建一遍,如上person1和person2都有一个名为sayName()的方法,但是两个方法不是同一个Function实例。简单的改进方法如下:
function Person(name,age,job){ this.name = name; this.age = age; this.job = job; this.sayName = sayName; } function sayName(){ alert(this.name); } var person1 = new Person("海绵宝宝",27,"software engineer"); var person2 = new Person("Frederick",29,"Manager"); person1.sayName();//海绵宝宝 person2.sayName();//Frederick
上面改造之后我们把sayName放到了构造函数之外,在构造函数内部person1和person2通过指针引用指向了全局的sayName()方法,这样一来person1和person2就共享了全局的sayName()方法。这样做同样有缺点——多出了一个名不副实的全局函数,如果对象的方法很多就会有很多这样的全局函数,为了解决这些问题可以采用下面的原型模式。
原型模式,如下所示:
function Person(){} Person.prototype.name = "海绵宝宝"; Person.prototype.age = 27; Person.prototype.job = "software engineer"; Person.prototype.sayName = function(){ alert(this.name); } var person1 = new Person(); person1.sayName(); var person2 = new Person(); person2.sayName();
上面的方式显然还不够好,所有的实例都共享相同的信息,为此我们可以再改造一下。
组合使用构造函数模式和原型模式,如下所示:
function Person(name,age,job){ this.name = name; this.age = age; this.job = job; this.friends = ['Tom','Jerry']; } Person.prototype = { constructor: Person, sayName: function(){ alert(this.name); } } var person1 = new Person("海绵宝宝",27,"software engineer"); var person2 = new Person("Frederick",29,"Manager"); person1.friends.push("Nancy"); alert(person1.friends);//Tom,Jerry,Nancy alert(person2.friends);//Tom,Jerry alert(person1.sayName == person2.sayName);//true