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原生的一些輔助方法
- 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]); }