推薦閱讀:https://blog.csdn.net/cc18868876837/article/details/81211729,作者:碼飛_CC,講的很詳情,而且有圖解
總結一下:
- 我們需要牢記兩點:①
__proto__
和constructor
屬性是對象所獨有的;②prototype
屬性是函數所獨有的,因爲函數也是一種對象,所以函數也擁有__proto__
和constructor
屬性。 - __proto__屬性的作用就是當訪問一個對象的屬性時,如果該對象內部不存在這個屬性,那麼就會去它的__proto__屬性所指向的那個對象(父對象)裏找,一直找,直到__proto__屬性的終點null,然後返回undefined,再往上找就相當於在null上取值,會報錯。通過__proto__屬性將對象連接起來的這條鏈路即我們所謂的原型鏈。
prototype
屬性的作用就是讓該函數所實例化的對象們都可以找到公用的屬性和方法,即f1.__proto__ === Foo.prototype
constructor
屬性的含義就是指向該對象的構造函數,所有函數(此時看成對象了)最終的構造函數都指向Function
hasOwnProperty函數:
所有繼承了 Object
的對象都會繼承到 hasOwnProperty
方法。這個方法可以用來檢測一個對象是否含有特定的自身屬性;他能判斷一個對象是否包含自定義屬性而不是原型鏈上的屬性,因爲hasOwnProperty 是 JavaScript 中唯一一個處理屬性但是不查找原型鏈的函數。
avaScript 不會保護 hasOwnProperty
被非法佔用,因此如果一個對象碰巧存在這個屬性, 就需要使用外部的 hasOwnProperty
函數來獲取正確的結果。當檢查對象上某個屬性是否存在時,hasOwnProperty
是唯一可用的方法。 同時在使用 for in
loop 遍歷對象時,推薦總是使用 hasOwnProperty
方法, 這將會避免原型對象擴展帶來的干擾
// 修改 Object.prototype
Object.prototype.bar = 1;
var foo = {moo: 2};
for(var i in foo) {
//console.log(i); // 輸出兩個屬性:bar 和 moo
if (foo.hasOwnProperty(i)) {
console.log(i);
}
}
/*
由於我們使用了 hasOwnProperty,所以這次只輸出 moo。 如果不使用 hasOwnProperty,則這段代碼在原生對象原型(比如 Object.prototype)被擴展時可能會出錯
*/