在es6中,has()方法用於攔截HasProperty操作,也可用於隱藏某些屬性;該方法作為函數的in運算符,傳回一個布林值,指示是否存在自有或繼承的屬性,語法為「Reflect.has(查找屬性的目標物件,要檢查的屬性)」。
本教學操作環境:windows10系統、ECMAScript 6.0版、Dell G3電腦。
has作為函數的 in 運算符,它傳回一個布林值,指示是否存在自有或繼承的屬性。
下面給出了函數has()的語法,其中,
target是要在其中尋找屬性的目標物件。
propertyKey是要檢查的屬性的名稱。
Reflect.has(target, propertyKey)
has()方法用來攔截 HasProperty 操作,也就是判斷物件是否具有某個屬性時,這個方法會生效。典型的操作就是 in 運算子。
has()方法可以接受兩個參數,分別是目標物件、需查詢的屬性名稱。
使用 has()方法隱藏某些屬性,不被 in 運算子發現。
var handler = { has(target, key) { if (key[0] === "_") { return false; } return key in target; }, }; var target = { _prop: "foo", prop: "foo" }; var proxy = new Proxy(target, handler); "_prop" in proxy; // false
如果原始物件的屬性名稱的第一個字元是下劃線,proxy.has()就會傳回 false,因此不會被 in 運算子發現。
如果原始物件不可配置或禁止擴展,這時 has()攔截會報錯。
var obj = { a: 10 }; Object.presentExtensions(obj); var p = new Proxy(obj, { has: function(target, prop) { return false; }, }); "a" in p; // TypeError is thrown
上面程式碼中,obj 物件禁止擴展,結果使用 has 攔截就會報錯。也就是說,如果某個屬性不可配置(或目標物件不可擴充),則 has()方法就不得「隱藏」(即傳回 false)目標物件的該屬性。
值得注意的是,has()方法攔截的是 HasProperty 操作,而不是 HasOwnProperty 操作,即 has()方法不判斷一個屬性是物件本身的屬性,還是繼承的屬性。
另外,雖然 for…in 迴圈也用到了 in 運算符,但是 has()攔截對 for…in 迴圈不生效。
let stu1 = { name: "lily", score: 59 }; let stu2 = { name: "lucy", score: 99 }; let handler = { has(target, prop) { if (prop === "score" && target[prop] < 60) { console.log(`${target.name} 不及格`); return false; } return prop in target; }, }; let oproxy1 = new Proxy(stu1, handler); let oproxy2 = new Proxy(stu2, handler); "score" in oproxy1; // lily 不及格 // false "score" in oproxy2; // true for (let a in oproxy1) { console.log(oproxy1[a]); } // lily // 59 for (let b in oproxy2) { console.log(oproxy2[b]); } // lucy // 99
上面程式碼中,has()攔截只對 in 運算子生效,對 for…in 迴圈不生效,導致不符合要求的屬性沒有被 for…in 迴圈所排除。
【相關推薦:javascript影片教學、web前端】
以上是es6裡面has()的用法是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!