ECMAScript 6 學習:Reflect篇

目錄

Reflect.get(target, name, receiver)

Reflect.set(target, name, value, receiver)

Reflect.has(obj, name)

Reflect.deleteProperty(obj, name)

Reflect.construct(target, args) 

Reflect.getPrototypeOf(obj)

Reflect.setPrototypeOf(obj, newProto)

Reflect.apply(func, thisArg, args)

Reflect.defineProperty(target, propertyKey, attributes)

Reflect.getOwnPropertyDescriptor(target, propertyKey) 

Reflect.isExtensible (target) 

Reflect.preventExtensions(target)

Reflect.ownKeys (target)


Reflect對象是ES6 爲了操作對象而提供的新 API。

 

Reflect.get(target, name, receiver)

1、Reflect.get方法查找並返回target對象的name屬性,如果沒有該屬性,則返回undefined

2、如果name屬性部署了讀取函數(getter),則讀取函數的this綁定receiver

var myObject = {
  foo: 1,
  bar: 2,
  get baz() {
    return this.foo + this.bar;
  },
};

var myReceiverObject = {
  foo: 4,
  bar: 4,
};

Reflect.get(myObject, 'baz', myReceiverObject) // 8

3、如果第一個參數不是對象,Reflect.get方法會報錯。

 

Reflect.set(target, name, value, receiver)

1、Reflect.set方法設置target對象的name屬性等於value

2、如果name屬性設置了賦值函數,則賦值函數的this綁定receiver

var myObject = {
  foo: 4,
  set bar(value) {
    return this.foo = value;
  },
};

var myReceiverObject = {
  foo: 0,
};

Reflect.set(myObject, 'bar', 1, myReceiverObject);
myObject.foo // 4
myReceiverObject.foo // 1

3、如果 Proxy 對象和 Reflect 對象聯合使用,前者攔截賦值操作,後者完成賦值的默認行爲,而且傳入了receiver,那麼Reflect.set會觸發Proxy.defineProperty攔截。

4、如果第一個參數不是對象,Reflect.set會報錯。

 

Reflect.has(obj, name)

1、Reflect.has方法對應name in obj裏面的in運算符

2、如果第一個參數不是對象,Reflect.hasin運算符都會報錯。

 

Reflect.deleteProperty(obj, name)

1、Reflect.deleteProperty方法等同於delete obj[name],用於刪除對象的屬性。

2、該方法返回一個布爾值。如果刪除成功,或者被刪除的屬性不存在,返回true;刪除失敗,被刪除的屬性依然存在,返回false

 

Reflect.construct(target, args) 

Reflect.construct方法等同於new target(...args),這提供了一種不使用new,來調用構造函數的方法。

function Greeting(name) {
  this.name = name;
}

// new 的寫法
const instance = new Greeting('張三');

// Reflect.construct 的寫法
const instance = Reflect.construct(Greeting, ['張三']);

 

Reflect.getPrototypeOf(obj)

1、Reflect.getPrototypeOf方法用於讀取對象的__proto__屬性,對應Object.getPrototypeOf(obj)

2、如果參數不是對象,Object.getPrototypeOf會將這個參數轉爲對象,然後再運行,而Reflect.getPrototypeOf會報錯。

 

Reflect.setPrototypeOf(obj, newProto)

1、Reflect.setPrototypeOf方法用於設置目標對象的原型(prototype),對應Object.setPrototypeOf(obj, newProto)方法。它返回一個布爾值,表示是否設置成功。

2、如果無法設置目標對象的原型(比如,目標對象禁止擴展),Reflect.setPrototypeOf方法返回false

3、如果第一個參數不是對象,Object.setPrototypeOf會返回第一個參數本身,而Reflect.setPrototypeOf會報錯。

4、如果第一個參數是undefinednullObject.setPrototypeOfReflect.setPrototypeOf都會報錯。

 

Reflect.apply(func, thisArg, args)

Reflect.apply方法等同於Function.prototype.apply.call(func, thisArg, args),用於綁定this對象後執行給定函數。

const ages = [11, 33, 12, 54, 18, 96];

// 舊寫法
const youngest = Math.min.apply(Math, ages);
const oldest = Math.max.apply(Math, ages);
const type = Object.prototype.toString.call(youngest);

// 新寫法
const youngest = Reflect.apply(Math.min, Math, ages);
const oldest = Reflect.apply(Math.max, Math, ages);
const type = Reflect.apply(Object.prototype.toString, youngest, []);

 

Reflect.defineProperty(target, propertyKey, attributes)

1、Reflect.defineProperty方法基本等同於Object.defineProperty,用來爲對象定義屬性

2、如果Reflect.defineProperty的第一個參數不是對象,就會拋出錯誤

 

Reflect.getOwnPropertyDescriptor(target, propertyKey) 

1、Reflect.getOwnPropertyDescriptor基本等同於Object.getOwnPropertyDescriptor,用於得到指定屬性的描述對象

2、如果第一個參數不是對象,Object.getOwnPropertyDescriptor(1, 'foo')不報錯,返回undefined,而Reflect.getOwnPropertyDescriptor(1, 'foo')會拋出錯誤,表示參數非法。

 

Reflect.isExtensible (target) 

1、Reflect.isExtensible方法對應Object.isExtensible,返回一個布爾值,表示當前對象是否可擴展。

2、如果參數不是對象,Object.isExtensible會返回false,因爲非對象本來就是不可擴展的,而Reflect.isExtensible會報錯。

 

Reflect.preventExtensions(target)

1、Reflect.preventExtensions對應Object.preventExtensions方法,用於讓一個對象變爲不可擴展。它返回一個布爾值,表示是否操作成功。

2、如果參數不是對象,Object.preventExtensions在 ES5 環境報錯,在 ES6 環境返回傳入的參數,而Reflect.preventExtensions會報錯。

 

Reflect.ownKeys (target)

Reflect.ownKeys方法用於返回對象的所有屬性,基本等同於Object.getOwnPropertyNamesObject.getOwnPropertySymbols之和。

var myObject = {
  foo: 1,
  bar: 2,
  [Symbol.for('baz')]: 3,
  [Symbol.for('bing')]: 4,
};

// 舊寫法
Object.getOwnPropertyNames(myObject)
// ['foo', 'bar']

Object.getOwnPropertySymbols(myObject)
//[Symbol(baz), Symbol(bing)]

// 新寫法
Reflect.ownKeys(myObject)
// ['foo', 'bar', Symbol(baz), Symbol(bing)]

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章