js面向對象:封裝

封裝

1.不合理:構造函數模式的問題

構造函數方法很好用,但是存在一個浪費內存的問題。
請看,我們現在為Cat對象添加一個不變的屬性type(種類),再添加一個方法eat(吃)。那么,原型對象Cat就變成了下面這樣:

function Cat(name,color){
    this.name = name;
    this.color = color;
    this.type = "貓科動物";
    this.eat = function(){alert("吃老鼠");};
  }
 var cat1 = new Cat("大毛","黃色");
  var cat2 = new Cat ("二毛","黑色");
  alert(cat1.type); // 貓科動物
  cat1.eat(); // 吃老鼠
  alert(cat1.eat == cat2.eat); //false

2.合理的方式:Prototype模式

 function Cat(name,color){
    this.name = name;
    this.color = color;
  }
 Cat.prototype.type = "貓科動物";
 Cat.prototype.eat = function(){alert("吃老鼠")};
var cat1 = new Cat("大毛","黃色");
  var cat2 = new Cat("二毛","黑色");
  alert(cat1.type); // 貓科動物
  cat1.eat(); // 吃老鼠
  alert(cat1.eat == cat2.eat); //true

3.Prototype模式的驗證方法
3.1.isPrototypeOf()

這個方法用來判斷,某個proptotype對象和某個實例之間的關系。

alert(Cat.prototype.isPrototypeOf(cat1)); //true
alert(Cat.prototype.isPrototypeOf(cat2)); //true

3.2 .hasOwnProperty()

每個實例對象都有一個hasOwnProperty()方法,用來判斷某一個屬性到底是本地屬性,還是繼承自prototype對象的屬性。

alert(cat1.hasOwnProperty("name")); // true
alert(cat1.hasOwnProperty("type")); // false

3.3 .in運算符

in運算符可以用來判斷,某個實例是否含有某個屬性,不管是不是本地屬性。in運算符還可以用來遍歷某個對象的所有屬性。

alert("name" in cat1); // true
alert("type" in cat1); // true
  for(var prop in cat1) { alert("cat1["+prop+"]="+cat1[prop]); }

參考文檔 ++Javascript 面向對象編程(一):封裝

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Javascript是一種基于對象(object-based)的語言,你遇到的所有東西幾乎都是對象。但是,它又不是...
    云端漫記閱讀 248評論 0 0
  • Javascript是一種基于對象(object-based)的語言,你遇到的所有東西幾乎都是對象。但是,它又不是...
    一句諾言閱讀 210評論 0 0
  • (一):封裝 Javascript是一種基于對象(object-based)的語言,你遇到的所有東西幾乎都是對象。...
    曾基錕閱讀 231評論 0 0
  • 畢淑敏說:所有的動力都來自內心的沸騰,如果你做不到一件事,是因為你還沒有真正想做。一個人躺在地上,如果他不...
    潘多拉簡書閱讀 584評論 0 3
  • 簡單吃頓“農家菜”已經無法在競爭中難以站穩腳。 較為典型的是,不少地方“農家樂”已從最初提供吃農家菜、住農家屋等簡...
    6959cef3343c閱讀 514評論 0 0