標籤:程式 相對 code 調用 ng2 建構函式 物件導向 back 完成
# 上次講到用建構函式的模式來建立對象,相對於原廠模式,解決可對象識別的問題。
1 function Person(name,age,job){ 2 this.name=name; 3 this.age=age; 4 this.job=job; 5 this.sayname=function(){ 6 console.log(this.name); 7 } 8 } 9 10 var person1=new Person("xiaoming",12,"Doctor");11 person1.sayname();//xiaoming
# 如上,是使用建構函式模式建立對象的形式。使用建構函式的主要問題是,每個方法都要在每個執行個體上重新建立一次。其實質可以效果等同於以下形式:
1 function Person(name,age,job){ 2 this.name=name; 3 this.age=age; 4 this.job=job; 5 this.sayname=new Function("console.log(this.name)"); 6 } 7 8 var person1=new Person("xiaoming1",12,"Doctor"); 9 var person2=new Person("xiaoming2",12,"Doctor");10 person1.sayname();//xiaoming111 person2.sayname();//xiaoming2
# 從以上代碼看,雖然 person1和person2都有一個sayname方法,但是其實兩個是不同的Function執行個體。如下:
1 console.log(person1.sayname==person2.sayname);//false
# 這樣,當我們建立很多執行個體對象時,相當於同時建立了很多完成同樣的任務的不同的sayname()方法,顯然不是很好!
# 嘗試著把函數定義轉移到建構函式外部,如下:
1 function Person(name,age,job){ 2 this.name=name; 3 this.age=age; 4 this.job=job; 5 this.sayname=sayname; 6 } 7 function sayname(){ 8 console.log(this.name); 9 }10 var person1=new Person("xiaoming1",12,"Doctor");11 var person2=new Person("xiaoming2",12,"Doctor");12 person1.sayname();//xiaoming113 person2.sayname();//xiaoming214 15 console.log(person1.sayname==person2.sayname);//true
# 如上,這樣寫話就解決了多個函數完成同樣的功能的問題,person1和person2實際上共用了全域範圍中的sayname函數。
# 但是這裡存在以下問題:
(1)在全域範圍中定義的sayname函數實際上只是被Person對象調用,這樣讓全域範圍有點名不副實。
(2)如果對象中需要定義很多方法,意味著需要定義很多全域函數。
(3)Person這個自訂的物件類型沒有封裝性可言。
~~可以通過原型模式解決上面的問題。
JS高程6.物件導向的程式設計(2)建立對象_3 建構函式存在的問題