1.使用Object创建对象
var person = new Object(); person.name = "Nicholas"; person.age = "29"; person.job = "Software Engineer"; person.sayName = function(){ alert(this.name); }; //对象字面量写法 var person = { name: "Nicholas", age: "29", job: "Software Engineer", sayName: function(){ alert(this.name); } };
缺点:使用同一个接口创建很对对象,会产生大量的重复代码。
2.工厂模式
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 person1 = createPerson("Nicholas", "29", "Software Engineer"); var person2 = createPerson("Greg", "27", "Doctor");
缺点:无法识别对象的类型。
3.构造函数模式
function Person(name, age, job) { this.name = name; this.age = age; this.job = job; this.sayName = function(){ alert(this.name); }; } //构造函数使用new操作符来调用 var person1 = new Person("Nicholas", "29", "Software Engineer"); var person2 = new Person("Greg", "27", "Doctor");
缺点:每个方法都要在实例上重新创建一遍
//不同实例上的同名函数是不相等的 alert(person1.sayName == person2.sayName); //false //可以把函数定义转移到构造函数外来解决这个问题 function Person(name, age, job) { this.name = name; this.age = age; this.job = job; this.sayName = sayName; } function sayName() { alert(this.name); }
4.原型模式
我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,这个对象的用途是包含可以有特定类型的所有实例共享的属性和方法。
function Person() { } Person.prototype.name = "Nicholas"; Person.prototype.age = "29"; Person.prototype.job = "Software Engineer"; Person.prptptype.sayName = function(){ alert(this.name); }; var person1 = new Person(); person1.sayName(); //"Nicholas" var person2 = new Person(); person2.sayName(); //"Nicholas" alert(person1.sayName == person2.sayName); //true
//更简单的原型语法 function Person() { } Person.prototype = { constructor : Person, //以对象字面量形式创建新对象,constructor不再指向Person,在此特意设置为Person name : "Nicholas", age : "29", job : "Software Engineer", sayName : function () { alert(this.name); } };
原型和实例通过prototype和constructor属性相互关联
代码读取某个对象的属性时,是先检索实例,在检索实例的原型,所以实例的属性会覆盖原型的属。
重新原型对象会切断原型与实例的联系,而修改原型对象不会。
缺点:实例无法拥有自己的属性
5.组合使用构造函数模式和原型模型
//构造函数模式用于定义实例属性 function Person(name, age, job) { this.name = name; this.age = age; this.job = job; this.friend = ["Shelby", "Court"]; } //原型模式用于定义方法和共享属性 Person.prototype = { constructor : Person; sayName : function() { alert(this.name); } }
6.动态原型模式,寄生构造函数模式,稳妥构造函数模式