var person = new Object(); person.name = "zhouquan"; person.age = 21; person.sayName = function(){ console.log(this.name); }; person.sayName();//zhouquan
var person = { name: "zhouquan", age: 21, sayName:function(){ console.log(this.name); } }; person.sayName();//zhouquan
經過普通的建立object實例的方式和對象字面量的方式建立對象的方式的缺點在於:這兩種方式都不適合屢次建立同一類型的對象。函數
function createPerson(name, age, job){ var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function(){ console.log(this.name); }; return o; } var person1 = createPerson("zhouquan", 22, "student"); person1.sayName(); //zhouquan var person2 = createPerson("zhouquan2", 23, "Programer"); person2.sayName(); //zhouquan2
函數createPerson()可以根據接受的參數來構建一個包含全部必要信息的Person對象。能夠無數次的調用這個函數,而每次都會返回一個包含數個屬性的和一個方法的對象。工廠模式雖然解決的建立多個相似對象的問題,但卻沒有解決對象識別的問題(即怎樣知道一個對象的類型)。this
function Person(name, age){ this.name = name; this.age = age; this.sayName = function(){ console.log(this.name); }; } var person1 = new Person("zhouquan", 21); person1.sayName(); //zhouquan var person2 = new Person("zhouquan2", 23); person2.sayName(); //zhouquan2
用這種方式建立對象更工廠模式比起來具備如下幾點區別:spa
此外,還應該注意到函數名Person使用的大寫字母P。這個是爲了區別於其餘的函數。prototype
function Person(){ } Person.prototype.name = "zhouquan"; Person.prototype.age = 21; Person.prototype.sayName = function(){ console.log(this.name); }; var person1 = new Person(); person1.sayName();//zhouquan var person2 = new Person(); person2.sayName();//zhouquan
prototype(原型)屬性,這個屬性是一個指針,指向一個對象,而這個對象的用途是包含能夠有特定類型的全部實例共享的屬性和方法。使用原型對象的好處也就是可讓全部的對象實例共享它所包含的屬性和方法。指針
可是這種方法寫起來仍是不方便,須要在每個屬性或者方法前面書寫Person.prototype,我能夠結合前面的對象字面量的方法來進行改進:code
function Person(){ } Person.prototype={ name : "zhouquan", age : 21, sayName : function(){ console.log(this.name); } }; var person1 = new Person(); person1.sayName();//zhouquan var person2 = new Person(); person2.sayName();//zhouquan
function Person(name, age){ this.name = name; this.age = age; } Person.prototype={ sayName : function(){ console.log(this.name); } }; var person1 = new Person("zhouquan", 21); person1.sayName();//zhouquan var person2 = new Person("xiaozhou", 21); person2.sayName();//xiaozhou
這種方式是建立自定義類型的最多見方式。構造函數模式用於定義實例屬性,而原型模式用於定義方法和共享的屬性。這樣,每一個實例都會有本身的一份實例屬性的副本,但同時又共享這對方法的引用,最大限度地節省了內存。另外,這種組合模式還支持向構造函數傳遞參數。能夠說,這是用來定義引用類型的一中默認模式。對象
function Person(name, age){ this.name = name; this.age = age; if(typeof this.sayName != "function"){ Person.prototype.sayName = function(){ console.log(this.name); }; } } var person1 = new Person("zhouquan", 21); person1.sayName();//zhouquan var person2 = new Person("xiaozhou", 21); person2.sayName();//xiaozhou
這裏只在sayName()方法不存在的狀況下,纔會將它添加到原型中,if語句只在初次調用函數時纔會執行。其中if語句檢查的能夠是初始化以後應該存在的任何屬性或方法,沒必要用一大堆if語句檢查每一個屬性和方法,只要檢查一個便可。須要注意的是,使用動態原型模式時,不能使用對象字面量重寫原型,由於若是在以及建立了實例的狀況下重寫原型,那麼就會切斷現有實例與新原型之間的聯繫。blog