成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

初識(shí)Proxy、Reflect

gougoujiang / 3002人閱讀

摘要:主要原因應(yīng)該是在處理數(shù)組響應(yīng)是會(huì)存在缺陷。構(gòu)造函數(shù)其中表示生成一個(gè)實(shí)例,為需要代理的對(duì)象,則是一個(gè)對(duì)象,定義了各種代理行為。對(duì)于滿足條件的屬性以及其他屬性,直接保存報(bào)錯(cuò)報(bào)錯(cuò)攔截的操作,返回一個(gè)布爾值。

前言
https://segmentfault.com/a/11...

Vue3.0應(yīng)該馬上就要發(fā)布正式版了。聽說在新版本中,Proxy取代了Object.defineProperty進(jìn)行雙向綁定。主要原因應(yīng)該是Object.defineProperty在處理數(shù)組響應(yīng)是會(huì)存在缺陷。

let demo = {};
let arr = [];

Object.defineProperty(demo, "arr", {
  get: function() {
    return arr;
  },
  set: a => {
    console.log("hear set");
    arr = a;
  },
  configurable: true,
  enumerable: true
});

demo.arr = [1, 2, 3, 4]; // => "hear set";
console.log(arr === demo.arr); // => true
/* 通過索引修改數(shù)組,無法觸發(fā)set */
demo.arr[2] = null; // => 沒有輸出hear set。
console.log(arr === demo.arr); // => true
/* 通過push,pop,sort等方法同樣無法觸發(fā)set */
demo.arr.push("13"); // => 沒有輸出hear set。

Proxy
http://es6.ruanyifeng.com/#do...
示例

Proxy原意為代理,在實(shí)際操作中,可以理解為,在目標(biāo)數(shù)據(jù)前增加一個(gè)攔截器。通過攔截器,可以實(shí)現(xiàn)監(jiān)聽、修改目標(biāo)數(shù)據(jù)。

let obj = new Proxy(
  {},
  {
    set: function(target, key, receiver) {
      console.log(`set key ${key}`);
      return Reflect.set(target, key, receiver);
    },
    get: function(target, key, receiver) {
      console.log(`get key ${key}`);
      return Reflect.get(target, key, receiver);
    }
  }
);

obj.count = 1;
// => set key count;
obj.count++;
// => get key count;
// => set key count;

構(gòu)造函數(shù)
let obj = new Proxy(target, handler)

其中new Proxy表示生成一個(gè)Proxy實(shí)例,target為需要代理的對(duì)象,handler則是一個(gè)對(duì)象,定義了各種代理行為。
如果handler為空對(duì)象,訪問proxy與訪問target效果相同。

Proxy的實(shí)例方法 get()

get方法用于攔截某個(gè)屬性的讀取操作,可以接受三個(gè)參數(shù),依次為目標(biāo)對(duì)象、屬性名和 proxy 實(shí)例本身(嚴(yán)格地說,是操作行為所針對(duì)的對(duì)象),其中最后一個(gè)參數(shù)可選。

var person = {
  name: "張三"
};

var proxy = new Proxy(person, {
  get: function(target, property) {
    if (property in target) {
      return target[property];
    } else {
      throw new ReferenceError("Property "" + property + "" does not exist.");
    }
  }
});

proxy.name // "張三"
proxy.age // 拋出一個(gè)錯(cuò)誤
set()

set方法用來攔截某個(gè)屬性的賦值操作,可以接受四個(gè)參數(shù),依次為目標(biāo)對(duì)象、屬性名、屬性值和 Proxy 實(shí)例本身,其中最后一個(gè)參數(shù)可選。

let validator = {
  set: function(obj, prop, value) {
    if (prop === "age") {
      if (!Number.isInteger(value)) {
        throw new TypeError("The age is not an integer");
      }
      if (value > 200) {
        throw new RangeError("The age seems invalid");
      }
    }

    // 對(duì)于滿足條件的 age 屬性以及其他屬性,直接保存
    obj[prop] = value;
  }
};

let person = new Proxy({}, validator);

person.age = 100;

person.age // 100
person.age = "young" // 報(bào)錯(cuò)
person.age = 300 // 報(bào)錯(cuò)
has()

has(target, propKey)攔截propKey in proxy的操作,返回一個(gè)布爾值。

deleteProperty()

deleteProperty(target, propKey)攔截delete proxy[propKey]的操作,返回一個(gè)布爾值。

ownKeys()

ownKeys(target)攔截Object.getOwnPropertyNames(proxy)、Object.getOwnPropertySymbols(proxy)、Object.keys(proxy)、for...in循環(huán),返回一個(gè)數(shù)組。該方法返回目標(biāo)對(duì)象所有自身的屬性的屬性名,而Object.keys()的返回結(jié)果僅包括目標(biāo)對(duì)象自身的可遍歷屬性。

getOwnPropertyDescriptor()

getOwnPropertyDescriptor(target, propKey)攔截Object.getOwnPropertyDescriptor(proxy, propKey),返回屬性的描述對(duì)象。

defineProperty()

defineProperty(target, propKey, propDesc)攔截Object.defineProperty(proxy, propKey, propDesc)Object.defineProperties(proxy, propDescs),返回一個(gè)布爾值。

preventExtensions()

preventExtensions(target)攔截Object.preventExtensions(proxy),返回一個(gè)布爾值。

getPrototypeOf()

getPrototypeOf(target)攔截Object.getPrototypeOf(proxy),返回一個(gè)對(duì)象。

isExtensible()

isExtensible(target)攔截Object.isExtensible(proxy),返回一個(gè)布爾值。

setPrototypeOf()

setPrototypeOf(target, proto)攔截Object.setPrototypeOf(proxy, proto),返回一個(gè)布爾值。如果目標(biāo)對(duì)象是函數(shù),那么還有兩種額外操作可以攔截。

apply()

apply(target, object, args)攔截Proxy實(shí)例作為函數(shù)調(diào)用的操作,比如proxy(...args)proxy.call(object, ...args)、proxy.apply(...)。

construct()

construct(target, args)攔截Proxy實(shí)例作為構(gòu)造函數(shù)調(diào)用的操作,比如new proxy(...args)。

Reflect
http://es6.ruanyifeng.com/#do...
簡(jiǎn)介

Reflect對(duì)象與Proxy對(duì)象一樣,也是 ES6 為了操作對(duì)象而提供的新 API。其目的是:

Object對(duì)象的一些明顯屬于語言內(nèi)部的方法(比如Object.defineProperty),放到Reflect對(duì)象上。

修改某些Object方法的返回結(jié)果,讓其變得更合理。

Object操作都變成函數(shù)行為。

Reflect對(duì)象的方法與Proxy對(duì)象的方法一一對(duì)應(yīng)

使用Proxy監(jiān)聽數(shù)組
const queuedObservers = new Set();
const observe = fn => queuedObservers.add(fn);
const observable = obj => new Proxy(obj, { set });
function set(target, key, value, receiver) {
    const result = Reflect.set(target, key, value, receiver);
    queuedObservers.forEach(observer => observer());
    return result;
}
const person = observable({
    name: "Amber",
    age: 18
});
function print() {
    console.log(`${person.name}, ${person.age}`);
}
observe(print);

使用Proxy、Reflect實(shí)現(xiàn)觀察者模式

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/100820.html

相關(guān)文章

  • ECMAScript6(12):ProxyReflect

    摘要:返回一個(gè)布爾值攔截操作符,返回一個(gè)布爾值攔截操作符,返回一個(gè)布爾值攔截遍歷器,返回一個(gè)遍歷器攔截,返回一個(gè)布爾值攔截,返回一個(gè)數(shù)組。 Proxy 對(duì)象 Proxy 用來修改某些默認(rèn)操作,等同于在語言層面做出修改。所以屬于一種元編程(meta programming), 即對(duì)編程語言進(jìn)行編程。字面理解為Proxy代理了某些默認(rèn)的操作。其使用格式如下: var proxy = new Pr...

    habren 評(píng)論0 收藏0
  • ES6之Reflect

    摘要:查找并返回對(duì)象的屬性例例屬性部署了讀取函數(shù)返回的是的參數(shù)對(duì)象注意如果的第一個(gè)參數(shù)不是對(duì)象,則會(huì)報(bào)錯(cuò)。它返回一個(gè)布爾值,表示是否操作成功用于返回對(duì)象的所有屬性使用和實(shí)現(xiàn)觀察者模式請(qǐng)參考觀察者模式 1、什么是Reflect?為操作對(duì)象而提供的新API 2、為什么要設(shè)計(jì)Reflect?(1)將Object對(duì)象的屬于語言內(nèi)部的方法放到Reflect對(duì)象上,即從Reflect對(duì)象上拿Object...

    BingqiChen 評(píng)論0 收藏0
  • ES6 中的 ReflectProxy

    摘要:是中新增的特性。首先來說,的提出是為了整合之前中存在的一些不太合理的地方。表示當(dāng)前對(duì)象是否可擴(kuò)展,返回一個(gè)布爾值。更完美的枚舉很多代碼使用字符串普通或凍結(jié)的對(duì)象作為枚舉。通過記錄這些訪問和修改信息,能記錄下對(duì)這個(gè)對(duì)象的所有操作記錄。 Reflect Reflect 是ES6中新增的特性。它是一個(gè)普通對(duì)象,下面有13個(gè)靜態(tài)方法(enumerate在最終的發(fā)布版中被移除),可以再全局下訪問...

    wzyplus 評(píng)論0 收藏0
  • ECMAScript 6入門ProxyReflect(上)

    摘要:與學(xué)習(xí)的新語法糖既能學(xué)習(xí)到新東西,又能使得自己的代碼更加優(yōu)雅,逼格更高,爽與之間的運(yùn)用就是對(duì)對(duì)象的操作觸發(fā)的攔截是對(duì)對(duì)象進(jìn)行代理,通過生成的對(duì)象間接操作原本對(duì)象,最常見的就是與語法形式是需要操作的對(duì)象,而是包含操作對(duì)象的一些方法的對(duì)象是能夠 Proxy與Reflect 學(xué)習(xí)es6的新語法糖既能學(xué)習(xí)到新東西,又能使得自己的代碼更加優(yōu)雅,逼格更高,爽proxy與Reflect之間的運(yùn)用就是...

    DevTTL 評(píng)論0 收藏0
  • 深入理解ES6之《代理和反射》

    摘要:使用陷阱驗(yàn)證屬性用于接收屬性代理的目標(biāo)的對(duì)象要寫入的屬性鍵被寫入的屬性的值操作發(fā)生的對(duì)象通常是代理屬性必須是數(shù)字拋錯(cuò)用陷阱驗(yàn)證對(duì)象結(jié)構(gòu)屬性不存在拋出錯(cuò)誤使用陷阱隱藏已有屬性可以用操作符來檢測(cè)給定對(duì)象中是否包含有某個(gè)屬性,如果自有屬性或原型屬 使用set陷阱驗(yàn)證屬性 let target = { name: target } let proxy = new Proxy(targe...

    Stardustsky 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<