在JavaScript中,函數是一個包含屬性和方法的Function類型的對象。而原型(Prototype)就是Function類型對象的一個屬性。
在函數定義時九包含了prototype屬性,他的初始值是一個空對象。在JavaScript中並無定義函數的原始類型,因此原型能夠是任何類型。
原型是用於保存對象的共享屬性和方法的,原型的屬性和方法並不會影響函數自己的屬性和放大。函數
1.經過構造函數的prototype屬性this
function fn(){ console.log('this is function'); } console.log(fn.prototype);
2.經過Object對象的getgetPrototypeOf()方法prototype
function fn(){ console.log('this is function'); } console.log(Object.getPrototypeOf(fn));
}code
/*定義構造函數*/ function Fun(){ this.name = 'segment'; this.sayMe = function(){ console.log('this is function'); } } //操做構造函數Fun的原型 Fun.prototype.age = 18; // 利用構造函數來建立對象 var fun = new Fun(); console.log(fun); // 爲構造函數的原型新增的屬性 -> 構造函數建立的對象中依舊能夠訪問 console.log(fun.age);// 18 // 對象fun中不存在age屬性 var result = Object.getOwnPropertyDescriptor(fun, 'age'); console.log(result);
自有屬性:構造函數自己的屬性
原型屬性:經過原型所定義的屬性對象
function Mingzi (name){ this .name = name; this .sayMe = function(){ console .log('this is function') } } Mingzi.prototype.age = 18; var mingzi = new Hero('石原'); console.log(mingzi.name);// 石原 console.log(mingzi.age);// 18 var mingzi2 = new Mingzi('長澤雅嗎'); console.log(mingzi2.name);// 長澤雅美 console.log(mingzi2.age);// 18 Hero.prototype.age = 80; console.log(mingzi.age); console.log(mingzi2.age);
經過構造函數或對象的自有屬性能夠重寫原型的屬性
自有屬性與原型屬性同名時,默認訪問的是自有屬性ip
// 定義構造函數 function Hero(){ this.name = '張無忌'; } // 構造函數的原型 Hero.prototype.name = '周芷若'; // 構造函數建立對象 var hero = new Hero(); console.log(hero.name);// 張無忌 // 刪除對象的屬性 delete hero.name; // 從新訪問對象的屬性 console.log(hero.name);// 周芷若
Object.hasOwnProperty(prop)方法
做用 - 判斷當前指定屬性是否爲自有屬性
參數1.prop - 表示指定屬性名稱get
2.返回值 - 布爾值 true - 表示存在指定的自有屬性 false - 表示不存在指定的自有屬性
使用in關鍵字檢測對象的屬性
做用 - 判斷對象中是否存在指定屬性(自有屬性或原型屬性)
返回值 - 布爾值原型
true - 表示存在指定的屬性 false - 表示不存在指定的屬性
每一個函數function都有一個prototype,即顯式原型
每一個實例對象都有一個__proto__,可稱爲隱式原型
對象的隱式原型的值爲其對應構造函數的顯式原型的值
函數的prototype屬性: 在定義函數時自動添加的, 默認值是一個空Object對象
對象的__proto__屬性: 建立對象時自動添加的, 默認值爲構造函數的prototype屬性值
咱們能直接操做顯式原型, 但不能直接操做隱式原型io