JavaScript物件導向編程(3)prototype簡介
prototype——原型,用於給對象動態地新增屬性和行為
先定義個建構函式
//小配件function Gadget(name, color) {this.name = name;this.color = color;this.whatAreYou = function(){return '我是 ' + this.color + '的' + this.name;}this.get = function(what){return this[what];//對象與數組有類似之處,js的[]中可以是下標,也可以是對象的屬性}}
使用prototype增加屬性和方法
/*使用prototype增加屬性和方法*/Gadget.prototype.price = 100;//增加屬性Gadget.prototype.rating = 3;//增加行為==方法==或者叫函數Gadget.prototype.getInfo = function() {return '等級: ' + this.rating + ', 價格: ' + this.price;};/*也可批量替換或新增*/Gadget.prototype = {price:100,rating:3,getInfo:function() {//可訪問原始屬性return '名字:'+this.name+',等級: ' + this.rating + ', 價格: ' + this.price;}};var toy = new Gadget('網路攝影機','黑色');alert(toy.getInfo());//可訪問新的方法,也可訪問原有的屬性和方法
/*屬性的遍曆及判斷*/
for(i in toy){if(typeof(toy[i])!="function")//遍曆出toy上可以訪問的所有的屬性及屬性值alert(i + '=' + toy[i]);}
//判斷屬性是不是原始的for(prop in toy){if (toy.hasOwnProperty(prop)) {alert("原始:"+prop + '=' + toy[prop]);}}
每個對象都有isPrototypeOf方法,用於判斷當前對象是不是另外一個對象的prototype
/*Every object also gets the isPrototypeOf() method. * This method tells you whether that specific object is used as a prototype of another object.每個對象都有isPrototypeOf方法,用於判斷當前對象是不是另外一個對象的prototype* */var monkey = {hair: true,feeds: 'bananas',breathes: 'air'};function Human(name) {this.name = name;}Human.prototype = monkey;var george = new Human('George');alert("monkey.isPrototypeOf(george)==="+ monkey.isPrototypeOf(george));
總結:
可以將prototype看做是一個額外的對象,在構造器上引用一個prototype對象,這個對象擁有一些屬性和方法;
通過建構函式產生的對象也自然連結了這個prototype對象,而且可以把prototype對象的屬性和方法當做自己的;
當然,原始的屬性和通過prototype獲得的屬性還是有些不一樣,至少通過hasOwnProperty可以判斷出這個屬性是不是自己的原生屬性;
另外,可以通過a.isPrototypeOf(b)來判斷a是不是b的prototype。