JS hasOwnProperty()方法:檢測一個屬性是否是物件的自有屬性

2020-07-16 10:05:11
JavaScript hasOwnProperty() 方法是 Object 的原型方法(也稱實體方法),它定義在 Object.prototype 物件之上,所有 Object 的範例物件都會繼承 hasOwnProperty() 方法。

hasOwnProperty() 方法用來檢測一個屬性是否是物件的自有屬性,而不是從原型鏈繼承的。如果該屬性是自有屬性,那麼返回 true,否則返回 false。換句話說,hasOwnProperty() 方法不會檢測物件的原型鏈,只會檢測當前物件本身,只有當前物件本身存在該屬性時才返回 true。

例如,在下面自定義型別中,this.name 就表示物件的自有屬性,而原型物件中的 name 屬性就是繼承屬性。
function F() {  //自定義資料型別
    this.name = "自有屬性";
}
F.prototype.name = "繼承屬性";

hasOwnProperty() 的語法格式如下:

object.hasOwnProperty(propertyName);

引數說明:propertyName 參數列示要檢測的屬性名稱。

返回值:返回一個布林值。如果 propertyName 是自有屬性,那麼返回 true,否則返回 false。

範例1

針對上面的自定義型別,可以範例化物件,然後判定當前物件呼叫的屬性 name 是什麼型別。
var f = new F();  //範例化物件
console.log(f.hasOwnProperty("name"));  //返回true,說明當前呼叫的 name是自有屬性
console.log(f.name);  //返回字串“自有屬性”
凡是建構函式的原型屬性(原型物件包含的屬性),都是繼承屬性,使用 hasOwnProperty() 方法檢測時,都會返回 false。但是,對於原型物件本身來說,這些原型屬性又是原型物件的自有屬性,所以返回值又是 true。

範例2

在下面範例中,演示了 toString() 方法對於 Date 物件來說是繼承屬性,但是對於 Date 建構函式的原型物件來說,則是它的自有屬性。
var d = Date;
console.log(d.hasOwnProperty("toString"));  //返回false,說明toString()是Date的自有屬性
var d = Date.prototype;
console.log(d.hasOwnProperty("toString"));  //返回true,說明toString()是Date.prototype屬性
hasOwnProperty() 方法只能判斷指定物件中是否包含指定名稱的屬性,無法檢查物件原型鏈中是否包含某個屬性,所以能夠檢測出來的屬性必須是物件成員。

範例3

下面範例演示了 hasOwnProperty() 方法所能檢測的屬性範圍。
var o = {  //物件直接量
    o1 : {  //子物件直接量
        o2 : {  //孫子物件直接量
            name : 1  //孫子物件直接量的屬性
        }
    }
};
console.log(o.hasOwnProperty("o1"));  //返回true,說明o1是o的自有屬性
console.log(o.hasOwnProperty("o2"));  //返回false,說明o2不是o的自有屬性
console.log(o.o1.hasOwnProperty("o2"));  //返回true,說明o2是o1的自有屬性
console.log(o.o1.hasOwnProperty("name"));  //返回false,說明name不是o1的自有屬性
console.log(o.o1.hasOwnProperty("name"));  //返回true,說明name不是o2的自有屬性