js面向對象那些事(一)

1.緣起於構造函數

構造函數本身也是普通函數,但是在其內部使用了this對象指向構造函數本身。
每次實例化的新對象都包含一個constructor屬性,指向他們的構造函數

function Cat(name,color){

    this.name=name;

    this.color=color;

}
var cat1 = new Cat("大毛","黃色");
var cat2 = new Cat("二毛","黑色");
alert(cat1.constructor == Cat); //true

alert(cat2.constructor == Cat); //true

js規定 每個構造函數本身都包含一個prototype屬性,指向另一個對象。這個對象的所有屬性和方法,都會被構造函數的實例繼承。可以把那些不變的屬性和方法,直接定義在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(); // 吃老鼠

這時***所有實例的type屬性和eat()方法,其實都是同一個內存地址,指向prototype對象***,因此就提高了運行效率。

  alert(cat1.eat == cat2.eat); //true

2.關於propotype屬性 js原生的一些輔助方法

  1. isPrototypeOf()
    判斷,某個proptotype對象和某個實例之間的關係

2.hasOwnProperty()

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

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

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

3 in運算符可以用來判斷,某個實例是否含有某個屬性,不管是不是本地屬性。

    alert("name" in cat1); // true

  alert("type" in cat1); // true

in運算符還可以用來遍歷某個對象的所有屬性。

  for(var prop in cat1) { alert(“cat1[“+prop+”]=”+cat1[prop]); }

發佈了52 篇原創文章 · 獲贊 9 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章