国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【ES6】阮一峰ES6學(xué)習(xí)(六) Proxy

這篇具有很好參考價(jià)值的文章主要介紹了【ES6】阮一峰ES6學(xué)習(xí)(六) Proxy。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1. 前言

es6中全新設(shè)計(jì)了一個(gè)叫Proxy的類型,Proxy這個(gè)詞的原意是代理,用在這里表示由它來”代理“某些操作,可以譯為”代理器“,可以這樣理解:在目標(biāo)對(duì)象之前架設(shè)一層"攔截",外界對(duì)該對(duì)象的訪問,都必須先通過這層攔截 。

舉個(gè)簡(jiǎn)單的例子

比如茅臺(tái)酒的代理,有了這個(gè)代理,我們就不能直接從茅臺(tái)公司拿酒,必須通過這個(gè)代理

代理說多少錢,就是多少錢,代理說沒有就沒有

Proxy 代理的是一個(gè)對(duì)象,這個(gè)對(duì)象被代理之后,我們就不能直接訪問這個(gè)對(duì)象了,必須通過代理訪問。

比如像獲取某個(gè)屬性的值,代理說沒有就沒有,代理想給你返回啥值就返回啥值

Proxy就是專門為對(duì)象設(shè)置訪問代理器的,無論是讀還是寫都要經(jīng)過代理,通過proxy就能輕松監(jiān)視對(duì)象的讀寫過程。

2. 使用

如何使用Proxy監(jiān)視對(duì)象的讀寫過程呢?定義一個(gè)person對(duì)象,對(duì)象當(dāng)中有一個(gè)name屬性和height屬性,然后通過new Proxy的方式為person創(chuàng)建一個(gè)代理對(duì)象,此時(shí)proxy就是為person對(duì)象設(shè)置的攔截。

Proxy的構(gòu)造函數(shù)需要2個(gè)參數(shù),一個(gè)是需要代理的目標(biāo)對(duì)象,另一個(gè)是代理的處理對(duì)象,在這個(gè)處理對(duì)象中可以通過get()方法監(jiān)視對(duì)象屬性的訪問,通過set()方法監(jiān)視對(duì)象設(shè)置屬性的過程

const person={
    name:'zzz',
    height:185
}
const proxy=new Proxy(person,{
    get(){//監(jiān)視對(duì)象屬性的訪問

    },
    set(){//監(jiān)視對(duì)象設(shè)置屬性的過程

    }
})

3. Proxy 實(shí)例方法

1. get()方法

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

const proxy=new Proxy(person,{
    get(target,propKey){// 目標(biāo)對(duì)象  訪問的屬性名
        console.log(target,propKey); // {  } , name
    },
    set(){

    }
})
console.log(proxy.name); // zzz

// 第二個(gè)例子
var person = {
  name: "張三"
};

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

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

【ES6】阮一峰ES6學(xué)習(xí)(六) Proxy
get()方法正常的邏輯應(yīng)該是判斷代理目標(biāo)對(duì)象中是否存在訪問的屬性名,存在就返回對(duì)應(yīng)的值,不存在就返回undefined或者一個(gè)默認(rèn)值

get(target,propKey){
    return propKey in target? target[propKey]:'default'
},

//分別打印存在的屬性和不存在的屬性
console.log(proxy.name); //zzz
console.log(proxy.age); //default

2. set()方法

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

set(target,propKey,value){
    console.log(target,propKey,value);
}

proxy.sex='男'

控制臺(tái)就會(huì)打印出寫入的屬性和屬性值
【ES6】阮一峰ES6學(xué)習(xí)(六) Proxy

set()方法正常的邏輯應(yīng)該是為代理目標(biāo)設(shè)置指定屬性,在設(shè)置之前先做一些數(shù)據(jù)校驗(yàn),例如屬性名為height,那么那么就要判斷它的是否是一個(gè)數(shù)字,不是就拋出錯(cuò)誤

set(target,propKey,value){
    if(propKey=== 'height'){ //判斷屬性名是否為height
        if(!Number.isInteger(value)){//判斷是否為整數(shù)
            throw new TypeError(`${value} is not an int`)
        }
    }
    target[propKey]=value
}

set方法的第四個(gè)參數(shù)receiver,指的是原始的操作行為所在的那個(gè)對(duì)象,一般情況下是proxy實(shí)例本身

const handler = {
	set: function(obj, prop, value, receiver) {
		obj[prop] = receiver;
		return true;
	}
}
const proxy = new Proxy({}, handler);
proxy.foo = 'bar';
proxy.foo === proxy;

3. apply()方法

apply方法攔截函數(shù)的調(diào)用、callapply 操作

接受三個(gè)參數(shù),分別是 ==目標(biāo)對(duì)象、目標(biāo)對(duì)象的上下文對(duì)象(this) 和 目標(biāo)對(duì)象的參數(shù)數(shù)組。

var handler = {
	apply(target, ctx, args){
		return Reflect.apply(...arguments);
	}
};

下面代碼中,變量pProxy的實(shí)例,當(dāng)它作為函數(shù)調(diào)用時(shí)(p()),就會(huì)被apply方法攔截,返回一個(gè)字符串。

var target = function(){ return 'I am the target'};
var handler = {
  apply: function(){
    return 'i am the proxy';
  }
}
var p = new Proxy(target, handler);
console.log(p());  // "i am the proxy"

4. 為什么要存在Proxy?

因?yàn)樵贓S6之前,我們使用Object.defineProperty()來設(shè)置監(jiān)聽器,來監(jiān)聽對(duì)象屬性的獲取和改寫。但是如果其中存在其他的一些操作,我們是無法監(jiān)測(cè)到的,所以為了解決這樣一個(gè)問題,在ES6中增加了Proxy代理。Proxy可以幫助我們監(jiān)聽對(duì)象中的操作。

兩者對(duì)比

Object.defineProperty

let info = {
  name: 'dmc',
  age: 20
}

Object.defineProperty(info, 'name', {
  get() {
    console.log('get--獲取info的name值')
    return 'dl'
  },
  set() {
    console.log('set--設(shè)置info的name值')
  }
})

console.log(info.name) // get--獲取info的name值   dl
info.name = 'dmc'  // set--設(shè)置info的name值

Proxy文章來源地址http://www.zghlxwxcb.cn/news/detail-415660.html

let info = {
  name: 'dmc',
  age: 20
}

let infoProxy = new Proxy(info, {
  get(target, key) {
    console.log('獲取對(duì)象屬性')
    return target[key]
  },
  set(target, key, newValue) {
    console.log('設(shè)置對(duì)象屬性')
    target[key] = newValue
  }
})

到了這里,關(guān)于【ES6】阮一峰ES6學(xué)習(xí)(六) Proxy的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • ES6-2:Iterator、Proxy、Promise、生成器函數(shù)...

    ES6-2:Iterator、Proxy、Promise、生成器函數(shù)...

    打印出的是里面的內(nèi)容,如果是for in打印出來的是索引,of不能遍歷對(duì)象 Symbol.iterator是js內(nèi)置的,可以訪問直接對(duì)象arr[Symbol.iterator],()調(diào)用 對(duì)象非線性一般不能迭代 后兩個(gè)是偽數(shù)組,但是是真迭代器接口 類似于數(shù)組,但成員的值都是唯一的,沒有重復(fù) 與數(shù)組不同的是set沒有

    2024年04月11日
    瀏覽(27)
  • ES6中Promise、Async/await解決回調(diào)地獄、Proxy代理

    1.Promise 作為一些場(chǎng)景必須要使用的一個(gè)對(duì)象,比如說我們要發(fā)送一個(gè)請(qǐng)求,但是在發(fā)送這個(gè)請(qǐng)求之前我們需要以另一個(gè)請(qǐng)求返回的結(jié)果中的一個(gè)數(shù)據(jù)作為這次請(qǐng)求的參數(shù),也就是說這個(gè)請(qǐng)求必須在另一個(gè)請(qǐng)求后面,當(dāng)然我們用setTimeout定時(shí)器寫一個(gè)延時(shí)函數(shù)也可以,但是當(dāng)有

    2024年02月12日
    瀏覽(24)
  • Vue2和vue3中雙向數(shù)據(jù)綁定的原理,ES6的Proxy對(duì)象代理和JavaScript的Object.defineProperty,使用詳細(xì)

    簡(jiǎn)介: Object.defineProperty大家都知道,是vue2中雙向數(shù)據(jù)綁定的原理,它 是 JavaScript 中一個(gè)強(qiáng)大且常用的方法,用于定義對(duì)象屬性,允許我們精確地控制屬性的行為,包括讀取、寫入和刪除等操作; 而Proxy是vue3中雙向數(shù)據(jù)綁定的原理,是ES6中一種用于創(chuàng)建代理對(duì)象的特殊對(duì)象,

    2024年02月15日
    瀏覽(46)
  • ES6如何聲明一個(gè)類?類如何繼承?

    引言 在ES6(ECMAScript 2015)中,引入了類(class)的概念,使得JavaScript的面向?qū)ο缶幊谈又庇^和易于理解。類提供了一種結(jié)構(gòu)化的方式來定義對(duì)象的屬性和方法,并且支持繼承。在本文中,我們將深入探討如何在ES6中聲明一個(gè)類以及如何實(shí)現(xiàn)類的繼承。 1. 聲明一個(gè)類 在ES6中

    2024年02月08日
    瀏覽(12)
  • ES6 ~ ES11 學(xué)習(xí)筆記

    ES6 ~ ES11 學(xué)習(xí)筆記

    ·課程地址 let 不能重復(fù)聲明變量(var 可以) let 具有塊級(jí)作用域,內(nèi)層變量外層無法訪問 let 不存在變量提升(運(yùn)行前收集變量和函數(shù),提前聲明),但是 var 存在變量提升: 不影響作用域鏈: 案例: 如果在 for 循環(huán)中使用了 var 聲明 i,那么它會(huì)被提升到全局作用域 window

    2024年02月21日
    瀏覽(63)
  • es6的學(xué)習(xí)

    ECMAScript 6.0(以下簡(jiǎn)稱 ES6)是 JavaScript 語言的下一代標(biāo)準(zhǔn),已經(jīng)在 2015 年 6 月正式發(fā)布了。它的目標(biāo),是使得 JavaScript 語言可以用來編寫復(fù)雜的大型應(yīng)用程序,成為企業(yè)級(jí)開發(fā)語言。 一個(gè)常見的問題是,ECMAScript 和 JavaScript 到底是什么關(guān)系? 要講清楚這個(gè)問題,需要回顧歷史

    2024年02月11日
    瀏覽(17)
  • ES6學(xué)習(xí)-Class類

    constructor 構(gòu)造方法 this 代表實(shí)例對(duì)象 方法之間不需要逗號(hào)分隔,加了會(huì)報(bào)錯(cuò)。 類的數(shù)據(jù)類型就是函數(shù),類本身就指向構(gòu)造函數(shù)。 類的所有方法都定義在類的 prototype 屬性上面 類的內(nèi)部所有定義的方法,都是不可枚舉的(non-enumerable) ES6類內(nèi)部定義的方法不可枚舉;ES5可以

    2024年02月14日
    瀏覽(23)
  • js數(shù)組學(xué)習(xí)(ES6+)

    js(ES6+)數(shù)組學(xué)習(xí) 1.Array.prototype.forEach(fn) 遍歷數(shù)組,傳一個(gè)函數(shù),每次遍歷會(huì)運(yùn)行該函數(shù) 2.Array.prototype.map(fn) 數(shù)組映射,傳入一個(gè)函數(shù),映射數(shù)組中的每一項(xiàng),不會(huì)改動(dòng)原數(shù)組,然后返回一個(gè)新的數(shù)組! 3.Array.prototype.filter(fn) 數(shù)組篩選,傳入一個(gè)函數(shù),僅保留滿足條件的項(xiàng)。不

    2024年02月12日
    瀏覽(18)
  • ES6學(xué)習(xí)-module語法

    CommonJS模塊 ES6模塊 這種加載稱為“編譯時(shí)加載”或者靜態(tài)加載 靜態(tài)加載帶來的各種好處 效率要比 CommonJS 模塊的加載方式高。 能進(jìn)一步拓寬 JavaScript 的語法,比如引入宏(macro)和類型檢驗(yàn)(type system)這些只能靠靜態(tài)分析實(shí)現(xiàn)的功能。 不再需要 UMD 模塊格式了,將來服務(wù)器

    2024年02月13日
    瀏覽(23)
  • 【ECMAScript】ES6-ES11學(xué)習(xí)筆記

    注意事項(xiàng) 代碼中的注釋有筆記如 有一些錯(cuò)誤示范代碼,為了代碼整體可運(yùn)行,將其注釋如 當(dāng)代碼有輸出是,通常將輸出放在對(duì)應(yīng)代碼下一行,并注釋如下 1.聲明變量 2.定義常量 3.解構(gòu)賦值 4.模板字符串 5.簡(jiǎn)化對(duì)象寫法 6.箭頭函數(shù) 箭頭函數(shù)適合與this無關(guān)的回調(diào),定時(shí)器,數(shù)

    2024年02月13日
    瀏覽(52)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包