首頁  >  文章  >  web前端  >  es6裡面has()的用法是什麼

es6裡面has()的用法是什麼

WBOY
WBOY原創
2022-04-26 11:06:083632瀏覽

在es6中,has()方法用於攔截HasProperty操作,也可用於隱藏某些屬性;該方法作為函數的in運算符,傳回一個布林值,指示是否存在自有或繼承的屬性,語法為「Reflect.has(查找屬性的目標物件,要檢查的屬性)」。

es6裡面has()的用法是什麼

本教學操作環境:windows10系統、ECMAScript 6.0版、Dell G3電腦。

es6裡面has()的用法是什麼

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn