理解javascript面向對象的基本模式

理解面向對象的基本模式
通常狀況下 咱們的建立對象的方式以下:
var person = {};
person.name = "tugenhua";
person.age = 24;
person.sayName = function(){alert(this.name);}
person.sayName();//調用方法javascript

可是使用這個傳統的模式  會有個明顯的缺點 使用同一個接口建立不少對象 會產生不少重複的代碼;因此咱們就引來工廠模式來解決這個問題
工廠模式在不少動態語言中是建立類 可是在ECMAScript中是沒法建立類的 因此程序員就開發出函數 好比工廠模式函數以下:
function person(name,age,job){
 var o = {};//建立一個對象
 o.name = name;
 o.age = age;
 o.job = job;
 o.sayName = function(){alert(this.name);}
 return o; 
}
var person1 = person("tu",24,"IT");
var person2 = person("genhua",24,"II");
person1.sayName();//tu
person.sayName()//genhua;
這上面的函數是工廠模式的基本形式 雖然工廠模式解決了多個類似的對象問題 可是未解決的是對象識別的問題(怎樣知道一個對象的類型),即變量person1和變量person2調用函數person時候 返回的都是對象o. 以後咱們引入構造函數來解決多個對象的識別問題 下面是構造函數的基本形式。
function Person(name,age,job){
 this.name = name;
 this.age = age;
 this.job = job;
 this.sayName = new function(){
  alert(this.name); 
 } 
}
 var person1 = new Person("tugenhua",24,"IT"),
  person2= new Person("tutu",24,"IT");
 person1.sayName();//tugenhua
 person2.sayName();//tutu;
恩 上面的是構造函數模式 構造函數模式與工廠模式相比較 1 沒有明顯的建立對象 2 沒有返回值 3 直接將屬性和方法賦值給了this對象  優勢是:建立自定義構造函數未來能夠將它的實例標定爲一種特定
的類型 這也是說明的了 構造函數模式賽過工廠模式 可是構造函數模式雖然很好 可是仍是有缺點 每一個方法都要在每一個實例中建立一遍,上面的兩個實例的方法並非同樣的 person1.sayName == person2.sayName;//返回是false;可是上面的代碼咱們能夠改造下 由於咱們想要兩個實例的函數同樣 那麼咱們能夠把上面的sayName這個方法看成全局變量來申明,那麼這兩個就是引用的是同個函數了!雖然可讓不一樣的實例來調用同個函數 可是問題又來了 在全局做用域定於的函數實際上只能被某個對象調用。更讓人沒法接受的是 若是對象須要定於不少方法 那麼就要定於多個全局函數 那麼就缺少封裝性 這是個問題 因此咱們下面能夠引用javascript原型來解決上面的問題!原型就是可讓全部對象實例共享他們的屬性和方法!
理解原型:
不管何時 只要建立了一個新函數 該函數就會產生一個原型屬性對應 那麼全部的原型prototype屬性都會自動得到一個構造函數屬性 當調用一個構造函數新實例後 該實例內部會有個指針指向該原型屬性 咱們要明白最重要的一點是 連接是存在於實例與構造函數原型屬性之間 而並不是與構造函數之間 該原型模式基本形式以下
function Person(){}
Person.prototype = {
 name : "tugenhua",
 age : 24,
 job : "IT",
 sayName : function(){alert(this.name);} 
}
var person1 = new Person();
var person2 = new Person();java

相關文章
相關標籤/搜索