標籤:style blog color java 使用 os io strong
曾經對 hasOwnProperty() 方法和 in 操作符感到困惑,這回看書看到,就在這裡再次歸納總結一下
-----------------------------------------------------------------------------------------
hasOwnProperty 和 in 都是用於檢測 “對象是否包含某個屬性(包括一般屬性和方法,java裡叫做對象成員)” :
對象.hasOwnProperty("屬性名稱"); // "屬性名稱" 以字串形式傳遞
"屬性名稱" in 對象; // 用法同上
某些情況下,兩者效果一致,可以混用:
// 建立一個自訂對象var obj_1 = { // 對象定義了自己的屬性 sayHi: function() { return "Hi~ I‘m an object"; }}
obj_1.hasOwnProperty("sayHi"); // 返回 true"sayHi" in obj_1; // 返回 true
都返回 true。
但如果換種使用方式:
// 還是自訂對象var obj_2 = { // 也定義了自己的方法 sayHi: function() { return "Hi~ I‘m another object"; }}
obj_2.hasOwnProperty("toString"); // 返回 false"toString" in obj_2; // 返回 true
hsaOwnProperty 方法的返回結果跟上面不一樣了。。
稍微對比前後兩次使用方式,我們就可以發現其中的差別:
前一個 hasOwnProperty 檢測的是 sayHi 方法,由對象自己定義,結果返回 true。
後一個 hasOwnProperty 檢測的是 toString 方法,來自父類,結果返回 false。
產生什麼結果是跟屬性的來源有關嗎? 不是:
// 又是自訂對象var obj_3 = { // 並且重寫了 toString 方法 toString: function() { return "This is function \"toString\" which overridden by obj_3"; }}obj_3.hasOwnProperty("toString"); // 返回 true"toString" in obj_3; // 返回 true
這個 toString 仍是來源於父類,不同的是它經過了重寫,然後結果也跟著不一樣了。
“重寫”在這其中起了什麼作用?
如果要用一個詞概括的話那應該是“專屬”:
被重寫的屬性只屬於重寫了它的對象,這個對象獨自擁有了這個屬性(的拷貝),使用時無需再從父類身上尋找和擷取。而被重寫的屬性也打上了專屬於這個對象的印記,這個屬性無法被別的對象(用hasOwnProperty)檢測為true。
因此 如果按照字面意思,將 對象.hasOwnProperty("xx") 理解成:“對象是否擁有xx屬性” 顯然是不夠準確的——根類的屬性為所有對象所共有,卻無法檢測為true。
更準確的說法應該是:“xx屬性是否為指定對象所專屬” 。
那 in 呢?
從上面的結果看,in 總是返回 true ——不管“公有”、“私人”,不管是自己的還是父類的。
只要 hasOwnProperty 為 true,in 必為 true。in 的判定範圍大於 hasOwnProperty 的判定範圍。
如果把 hasOwnProperty 理解為“專屬”,那 in 就是 專屬+父類(或者說原型鏈),範圍是“一個體系”。
所以 "xx" in 對象 可以理解成:“xx屬性是否存在於指定對象所代表的體系裡”。
總結:
hasOwnProperty 用於檢測 某個屬性是否指定對象的專屬屬性。
in 用於檢測 某個屬性是否存在於對象或它的原型鏈中。