<font id="zqva1"></font>
<rt id="zqva1"></rt>
  • <tt id="zqva1"></tt>
    <cite id="zqva1"></cite>

    <cite id="zqva1"><noscript id="zqva1"></noscript></cite>
      <rp id="zqva1"><meter id="zqva1"></meter></rp>

        <cite id="zqva1"></cite>
          <b id="zqva1"></b>
          <rp id="zqva1"></rp>
          <cite id="zqva1"></cite>

          <rt id="zqva1"></rt>

        1. <rp id="zqva1"></rp>

          Vue3解決問題之Proxy在Vue中的作用

          時間:?2020-01-26閱讀:?29標簽:?Proxy

          前言

          在講解Proxy之前,我們有些前置知識點是必要掌握的:

          Object相關靜態函數

          Reflect相關靜態函數

          簡單說明知識盲點

          名稱介紹
          Object.isExtensible()方法判斷一個對象是否是可擴展的(是否可以在它上面添加新的屬性)
          Object.setPrototypeOf()方法設置一個指定的對象的原型 ( 即, 內部[[Prototype]]屬性)到另一個對象或null
          Object.preventExtensions()方法讓一個對象變的不可擴展,也就是永遠不能再添加新的屬性。
          Object.getOwnPropertyDescriptor()方法返回指定對象上一個自有屬性對應的屬性描述符。(自有屬性指的是直接賦予該對象的屬性,不需要從原型鏈上進行查找的屬性)
          Object.getPrototypeOf()方法返回指定對象的原型(內部[[Prototype]]屬性的值)。

          Reflect 是一個內置的對象,它提供攔截 JavaScript 操作的方法。這些方法與proxy handlers的方法相同。Reflect不是一個函數對象,因此它是不可構造的。可用來替換部分Object靜態函數, 比較好的一點是__避免直接報錯__

          其和Object.xxx類似 



          Vue沒有Proxy會怎么樣?

          參考文獻:Vue中你可能認為是buf的情況原來是這樣的

          Vue問題總結

          數組元素基本數據類型無法響應式

          添加/刪除對象屬性很麻煩


          proxy開始

          Proxy 對象用于定義基本操作的自定義行為(如屬性查找,賦值,枚舉,函數調用等)。

            var proxy = new Proxy(target,handler)
          

          參數組成

          名稱描述
          handler包含陷阱(traps)的占位符對象。
          traps提供屬性訪問的方法。這類似于操作系統中捕獲器的概念。
          target代理虛擬化的對象。它通常用作代理的存儲后端。

          畫圖演示



          陷阱API

          功能分類API
          操作值set、get
          操作屬性defineProperty、deleteProperty
          操作函數apply、construct
          原型、屬性描述符見下文

          獲取及設置

          		get(target, prop, receiver) {
                      console.log('handler.get()');
                      return target[prop];
          
                  },
                  set(obj, prop, value) {
                      console.log('handler.set()')
                      obj[prop]=value;
                  },
          


          操作屬性

          		defineProperty(...args) {
                      console.log('handler.defineProperty()');
                      Reflect.defineProperty(...args);
                  },
                  deleteProperty(target, prop) {
                      console.log('handler.deleteProperty()');
                      return Reflect.deleteProperty(target,prop);
          
                  }
          


          關于函數對象

          apply(target, thisArg, argumentsList) {
           console.log('handler.apply()',target, thisArg,argumentsList)
          },
          construct(target,args) {
                  console.log('handler.construct()');
                  return Reflect.construct(...args);
          },
          

          額外補充(了解)

          另外Proxy也提供了對原型、屬性描述符的攔截

           		setPrototypeOf(...args) {
                     console.log('handler.setPrototypeOf()');
                      // 設置原型 prototype
                      return Reflect.setPrototypeOf(...args);
                  },
                   getOwnPropertyDescriptor() {
                      console.log('handler.getOwnPropertyDescriptor()');
                       // 獲取屬性描述符 -&gt; defineProperty(obj,key,屬性描述符);
                       // { configurable:false } // 該屬性不能改,不能刪 
                  },
                  getPrototypeOf() {
                      // 獲取原型對象   Object.getPrototypeOf() 觸發
                      // Reflect.getPrototypeOf(); // 觸發
                      console.log('handler.getPrototypeOf()')
                  },
                  has(o,key) {  //  console.log('key' in obj); 觸發
                      console.log('handler.has()');
                      return key in o;
                      // return Reflect.has(o,key);
                  },
                  isExtensible() {
                      // 判斷對象是否不可操作(C) 添加屬性 -&gt; defineProperty 
                      // Reflect.isExtensible 觸發
                      console.log('handler.isExtensible()')
                  },
                  ownKeys() {
                      // Reflect.ownKeys 觸發  
                      // 獲取屬于自身非繼承的key
                      console.log('handler.ownKeys()')
                  },
                  preventExtensions() {
                      // 禁止 添加屬性
                      console.log('handler.preventExtensions()')
                  },


          取消代理

          一個對象,如果在自身對象上沒有某個屬性,比如自己不帶name屬性,但是原型鏈上有代理,就會觸發該代理get函數對于name屬性的行為

          創建一個可取消的代理對象 {proxy,revoke}

          var revocable = Proxy.revocable({}, {
            get(target, name) {
              return "[[" + name + "]]";
            }
          });
          var proxy = revocable.proxy;
          proxy.foo;              // "[[foo]]"
          revocable.revoke(); // 取消代理
          console.log(proxy.foo); // 拋出 TypeError
          吐血推薦

          1.站長廣告聯盟: 整理了目前主流的廣告聯盟平臺,如果你有流量,可以作為參考選擇適合你的平臺點擊進入...

          2.休閑娛樂: 直播/交友    優惠券領取   網頁游戲   H5游戲

          鏈接: http://www.modern-decoration.com.cn/article/detial/7797

          ES6的標準內置對象Proxy

          Proxy是ES6規范定義的標準內置對象,可以對目標對象的讀取、函數調用等操作進行攔截。一般來說,通過Proxy可以讓目標對象“可控”,比如是否能調用對象的某個方法,能否往對象添加屬性等等。

          ES6之Proxy

          Proxy用于修改某些操作的默認行為,等同于在語言層面做出修改,所以屬于一種『元編程』即對編程語言進行編程。Proxy 是在目標對象之前架設一層『攔截』,外部對對象的訪問,都需要經過該層攔截。因此在攔截中對外界的訪問進行過濾和改寫。

          Proxy 的巧用

          使用Proxy,你可以將一只貓偽裝成一只老虎。下面大約有6個例子,我希望它們能讓你相信,Proxy 提供了強大的 Javascript 元編程。盡管它不像其他ES6功能用的普遍,但Proxy有許多用途

          ES6中代理和反射(proxy)

          通過調用new proxy()你可以創建一個代理來替代另一個對象(被稱為目標),這個代理對目標對象進行了虛擬,因此該代理與該目標對象表面上可以被當做同一個對象來對待。

          Proxy及其優勢

          通常,當談到JavaScript語言時,我們討論的是ES6標準提供的新特性,本文也不例外。 我們將討論JavaScript代理以及它們的作用,但在我們深入研究之前,我們先來看一下Proxy的定義是什么。

          Js中Proxy

          Proxy 用于修改某些操作的默認行為(基本操作有屬性查找,賦值,枚舉,函數調用等)。get(target, propKey, receiver):攔截對象屬性的讀取;set: function(obj, prop, value,receive) : 攔截某個屬性的賦值操作

          使用 Proxy 更好的封裝 Storage API

          這篇文章提到 Proxy 這種語法可以用來封裝 sessionStorage、 localStorage 甚至是 IndexedDB。可以使用 Proxy 代理來使 API 更容易使用。首先介紹一下 Proxy 的基本用法:

          ES6 系列之 defineProperty 與 proxy

          我們或多或少都聽過數據綁定這個詞,數據綁定”的關鍵在于監聽數據的變化,可是對于這樣一個對象:var obj = {value: 1},我們該怎么知道 obj 發生了改變呢?ES5 提供了 Object.defineProperty 方法,該方法可以在一個對象上定義一個新屬性

          拿Proxy可以做哪些有意思的事兒

          Proxy是什么意思?Proxy是ES6中提供的新的API,可以用來定義對象各種基本操作的自定義行為,在我們需要對一些對象的行為進行控制時將變得非常有效。

          js_es6中對象代理proxy用法實例淺析

          ES6中提出了一個新的特性,就是proxy,用來攔截在一個對象上的指定操作。這個功能非常的有用。每當代理對象被賦值,處理器函數就會調用,這樣就可以用來調試某些問題。

          fly63.com版權所有,內容以共享、參考、研究為目的,不存在任何商業目的。其版權屬原作者所有,如有侵權,請與小編聯系!情況屬實本人將予以刪除!

          文章投稿關于web前端網站點搜索站長推薦網站地圖站長QQ:522607023

          小程序專欄: 土味情話心理測試腦筋急轉彎幽默笑話段子句子語錄成語大全

          国产精品高清视频免费 - 视频 - 在线观看 - 影视资讯 - 唯爱网