1.使用Object創建對象 2.工廠模式 3.構造函數模式 4.原型模式 我們創建的每個函數都有一個prototype(原型)屬性,這個屬性是一個指針,指向一個對象,這個對象的用途是包含可以有特定類型的所有實例共用的屬性和方法。 原型和實例通過prototype和constructor屬性相互關聯 ...
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); } }