在JavaScript中, 函數時一個包含屬性和方法的Function類型的對象。而原型(Prototype)就是Function類型對象的一個屬性。在函數定義是就包含了protopype屬性,它的出事值時一個空對像。在JavaScript中並無定義函數的圓形類型,因此原型能夠時任何類型。 原型時用於保護對象的共享屬性和方法的,原型的屬性和方法並不會影響函數自己的屬性和方法。
function foo (a,b){
return a+b;
}
console.log (typeof foo.prototyoe);//boject函數
經過以下兩種方式能夠獲取對象的原型,從而設置共享的屬性和方法:
經過構造函數的prototype屬性
function person(){
console.log ('person instantiated');
}
console.log(person.prototype);
經過Object對象的getPrototypeOf(obj)方法。
function Person(){
console.log (person instantiated);
}
console.log(Object.getprototypeOf(person));this
經過以下兩種方式能夠設置原型的屬性和方法。
構造函數.Prototype.屬性名+屬性值;
構造函數.prototype.方法名=function(){}
直接爲原型定義一個新對象。
構造函數.prototype={
屬性名:屬性值,
方法名:function(){}
}prototype
自由屬性: 經過對象的引用添加的屬性。其餘對象可能無此屬性:即便有,也是彼此獨立的屬性。
原型屬性:從原型屬性對象中繼承來的屬性,一旦原型屬性中屬性改變,全部繼承原型屬性對象屬性均改變。
function Emo(ename,salary){
this.ename=ename;
this.salary=salary;
}
Emp.prototype={city:北京市,dept:研發部}
var emp1 =new Emp('Mary',3800);
var emp2 =new Emp('tmp',3000);對象
使用hasOwnPrototype()方法檢測對象時否具備指定的自有屬性:
function Hero(){}
var hero = new Hero()
console.log(hero.hasOwnPrototype('name'));
使用in關鍵字檢測對象及其原型鏈中是否具備指定的屬性:
function Hero(){}
var hero=new Hero();
console.;log('name'in hero);繼承
經過原型看爲指定構造函數或對象擴展其屬性或方法,以下代碼實例:
function Hero (){}
Hero.protoptype={
name:'Mary',
salary:3800}
var hero =new Hero();
console.log (hero.name);//maryip
經過構造函數或對象的自由屬性能夠重寫原型的屬性, 以下代碼示例:
function Hero(){}
Hero.prototype={
name:'Mary',
salary:3800
}
var hero = new Hero();
hero.name='tom';
console.log(hero,name);//tomci
經過delete關鍵詞能夠刪除對象的屬性,若是該對象即具備原型屬性又具備既有屬性的話, 先刪除自由屬性,在刪除原型屬性。以下代碼示例:
function Hero(){}
Hero.prototype= {name:'Mary',salary:3800}
var hero =new Hero();
hero.name ='Tom';
delete hero.name;//刪除Tom
console.log(hero.name);//mary
delete hero.name;//刪除Mary
console.log(hero.name);//undefind原型鏈
每個對象都會具備一個isPrototypeOf()方法,該方法用來判斷一個對象是否時另外一個對象的原型。
var monkey= {}
function Human(){}
Human.prototype= monkey;
var man = new Human();
monkey.isPrototypeOf(man);//true
__proto__屬性
function Hero (){}
Hero.prototype={
name:'mary',
salay:3800
}
var hero =new Hero();
console.log(hero.name);//maey
上述代碼說明hero 對象存在一個指向構造函數Hero的原型,這個連接被叫作————proto————屬性只能在調式時使用。
————proto————屬性時指定對象的屬性。
prototype屬性時指定構造函數的屬性get
JavaScript中的內置對象有些具備prototype屬性,利用內置對象prototype屬性能夠爲內置對象擴展屬性或方法。經過原型屬性擴展內置對象的屬性和方法很是靈活,根據個性化要求制定JavaScript語言的具體內容。通常建議慎用這種方式,若是JavaScript的版本更新時可能會提供個性化屬性或方法,致使衝突。
Array.prototype.inArray =fuction (color){
if (this)[i]===color {return true;}
}
return false;
}
var a =['red','green','blue'];
console.log (a.inArray('red'));//true
console.log(a.inArray('yellow'));//false原型