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

【javaScript】Proxy與Object.defineProperty的區(qū)別

這篇具有很好參考價值的文章主要介紹了【javaScript】Proxy與Object.defineProperty的區(qū)別。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。


【javaScript】Proxy與Object.defineProperty的區(qū)別

Proxy和Object.defineProperty都是JavaScript中用于實現(xiàn)對象屬性攔截和代理的機制,但它們在功能和應用方面有一些區(qū)別。

功能方面的區(qū)別:

Object.defineProperty:它是ES5引入的屬性定義方法,通過直接定義對象屬性的特性(如可枚舉性、可寫性等),可以攔截屬性的讀取、寫入和刪除操作。但它只能攔截對象的屬性訪問,對于對象的整體操作(如對整個對象的賦值或屬性遍歷)并不會被攔截。

Proxy:它是ES6引入的代理機制,可以對整個對象進行代理,攔截對象的各種操作,包括屬性訪問、賦值、刪除、函數(shù)調用等。通過在代理對象上定義各種"陷阱"(trap)方法,可以自定義攔截行為,實現(xiàn)更細粒度的對象操作控制。

比如:

Object.defineProperty對整個對象進行賦值,不會觸發(fā)set攔截

const obj = {};

Object.defineProperty(obj, 'name', {
  get() {
    console.log('訪問name屬性');
    return 'John';
  },
  set(value) {
    console.log('設置name屬性');
    obj._name = value;
  }
});

// 訪問name屬性,觸發(fā)get攔截
console.log(obj.name); // 輸出: "訪問name屬性" 和 "John"

// 設置name屬性,觸發(fā)set攔截
obj.name = 'Alice'; // 輸出: "設置name屬性"

// 對整個對象進行賦值,不會觸發(fā)set攔截
obj = { age: 25 }; // 拋出TypeError: Assignment to constant variable.

輸出如下圖所示:

【javaScript】Proxy與Object.defineProperty的區(qū)別

Object.defineProperty對整個對象進行遍歷,不會觸發(fā)get攔截

var obj = {};

Object.defineProperty(obj, 'name', {
  get() {
    console.log('訪問name屬性');
    return 'John';
  },
  set(value) {
    console.log('設置name屬性');
    obj._name = value;
  }
});

// 訪問name屬性,觸發(fā)get攔截
console.log(obj.name); // 輸出: "訪問name屬性" 和 "John"

// 設置name屬性,觸發(fā)set攔截
obj.name = 'Alice'; // 輸出: "設置name屬性"

// 對整個對象進行賦值,不會觸發(fā)set攔截
obj = { name:"李四" }; 

輸出結果如下:

【javaScript】Proxy與Object.defineProperty的區(qū)別文章來源地址http://www.zghlxwxcb.cn/news/detail-482687.html

Proxy自定義攔截行為

const user = {
  name: 'John',
  age: 25,
};

const protectedUser = new Proxy(user, {
  set(target, property, value) {
    if (property === 'age') {
      throw new Error('age屬性不可被修改');
    }

    return Reflect.set(target, property, value);
  },
  deleteProperty(target, property) {
    if (property === 'name') {
      throw new Error('name屬性不可被刪除');
    }

    return Reflect.deleteProperty(target, property);
  },
});

console.log(protectedUser.name); // 輸出: "John"

protectedUser.name = 'Alice'; // 不會拋出錯誤,屬性賦值成功

console.log(protectedUser.name); // 輸出: "Alice"

protectedUser.age = 30; // 拋出錯誤,無法修改age屬性

delete protectedUser.name; // 拋出錯誤,無法刪除name屬性

Proxy的優(yōu)缺點

優(yōu)點:

  • 更全面的攔截能力:Proxy可以攔截對象的更多操作,包括對屬性的讀取、賦值、刪除等,以及函數(shù)的調用等,提供了更細粒度的攔截控制。
  • 可變性控制:Proxy可以用于控制對象的可變性,例如可以禁止對某些屬性進行賦值或刪除,從而實現(xiàn)更嚴格的對象保護和約束。

缺點

  • 兼容性問題:Proxy是ES6引入的新特性,舊版本的JavaScript環(huán)境可能不支持Proxy,因此在一些特定的環(huán)境或需求下,使用Proxy可能會導致兼容性問題。
  • 性能開銷:相比Object.defineProperty,Proxy的攔截機制更為復雜,因此在某些情況下可能會引入一定的性能開銷。但對于大多數(shù)應用場景來說,這種開銷可以忽略不計。

到了這里,關于【javaScript】Proxy與Object.defineProperty的區(qū)別的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 詳解vue中的Object.defineProperty

    詳解vue中的Object.defineProperty

    ? ?如果想要age遍歷的話 就設置屬性 打印出來 發(fā)現(xiàn)有可以枚舉的屬性age? 參考課程: 011_尚硅谷Vue技術_Object.defineProperty_嗶哩嗶哩_bilibili ? // 1.Vue中的數(shù)據(jù)代理: ? ? // ? ?通過Vm對象來代理data對象中屬性的操作(讀/寫) ? ? // 2.Vue中數(shù)據(jù)代理的好處: ? ? // ? 更加方便的

    2024年02月04日
    瀏覽(23)
  • 使用object.defineProperty來更新數(shù)據(jù)示例

    使用object.defineProperty來更新數(shù)據(jù)示例

    vue+element UI 第001個 查看專欄目錄: 按照VUE知識點 ------ 按照element UI知識點 echarts,openlayers,cesium,leaflet,mapbox,d3,canvas 免費交流社區(qū) 專欄目標 在vue和element UI聯(lián)合技術棧的操控下,本專欄提供行之有效的源代碼示例和信息點介紹,做到靈活運用。 (1)提供vue2的一些基本操

    2024年02月06日
    瀏覽(16)
  • Vue3.0里為什么要用 Proxy API 替代 defineProperty API ?

    Vue3.0里為什么要用 Proxy API 替代 defineProperty API ?

    定義: Object.defineProperty() ?方法會直接在一個對象上定義一個新屬性,或者修改一個對象的現(xiàn)有屬性,并返回此對象 為什么能實現(xiàn)響應式 通過 defineProperty ?兩個屬性, get 及 set get 屬性的 getter 函數(shù),當訪問該屬性時,會調用此函數(shù)。執(zhí)行時不傳入任何參數(shù),但是會傳入 th

    2024年03月09日
    瀏覽(25)
  • js通過Object.defineProperty() 定義和控制對象屬性

    js通過Object.defineProperty() 定義和控制對象屬性

    用于給一個對象定義一個新屬性或是修改某個現(xiàn)有屬性,并返回此對象。 Object.defineProperty(obj,prop,descriptor) ?它接收 3 個參數(shù),第 1 個是要定義屬性的對象;第 2 個是要定義或修改的屬性的屬性名或 Symbol;第 3 個是對該屬性的描述,稱之為屬性描述符,為一個對象,可以擁有

    2024年03月09日
    瀏覽(17)
  • 深入理解JavaScript中的Proxy代理

    JavaScript中的Proxy代理是ES6中引入的一項強大功能,它允許我們攔截、修改和自定義對象的底層操作。通過使用Proxy,我們可以在對象的屬性讀取、賦值、函數(shù)調用等操作之前或之后執(zhí)行自定義的行為。在本文中,我們將深入探討Proxy代理的各種用法和功能。 Proxy是JavaScript的一

    2024年02月07日
    瀏覽(16)
  • 解決 JavaScript 輸出為 [object Object] 的問題

    ??作者簡介:練習時長兩年半的Java up主 ??個人主頁:程序員老茶 ?? ps:點贊??是免費的,卻可以讓寫博客的作者開興好久好久?? ??系列專欄:Java全棧,計算機系列(火速更新中) ?? 格言:種一棵樹最好的時間是十年前,其次是現(xiàn)在 ??動動小手,點個關注不迷路,感

    2024年02月04日
    瀏覽(29)
  • JavaScript如何解決返回[object Promise]

    當使用JavaScript中的Promise時,當您嘗試訪問Promise的值時,您可能會看到返回值為 [object Promise] 的情況。這是因為Promise是一種異步操作,它不能立即返回結果,而是需要等待操作完成后返回結果。 要訪問Promise的值,您需要使用Promise的then()方法,該方法接受一個回調函數(shù)作為參

    2024年02月12日
    瀏覽(20)
  • iOS問題記錄 - type argument ‘nw_proxy_config_t‘ is neither an Objective-C object nor a block type

    iOS問題記錄 - type argument ‘nw_proxy_config_t‘ is neither an Objective-C object nor a block type

    升級Xcode 15后,意料之中,項目又遇到了問題。 Xcode: 15.0 CocoaPods: 1.12.1 flutter_inappwebview: 6.0.0-beta.24+1 Flutter項目在Xcode 15上編譯時報錯: 從報錯信息看,是因為 nw_proxy_config_t 的類型不對導致的,錯誤發(fā)生在 flutter_inappwebview 庫用到的 WebKit.framework 中,初步猜測可能是有什么新的

    2024年02月08日
    瀏覽(26)
  • Object.setPrototypeOf 與 Object.create() 的區(qū)別

    Object.setPrototypeOf 與 Object.create() 的區(qū)別

    在講之前,我們先回顧下創(chuàng)建對象的幾種方式,并且 Object 、 new Object() 和 Object.create 的區(qū)別 ①:字面量方式創(chuàng)建對象 ②:構造函數(shù)式創(chuàng)建對象 ③: Objecr.create 創(chuàng)建對象 第一和第二種本質上沒任何區(qū)別,只是簡化寫法,說下第二種和第三種的區(qū)別: new Object() 的過程中會繼承

    2023年04月09日
    瀏覽(14)
  • JavaScript 數(shù)組Array存儲方式及對象Object

    JavaScript 數(shù)組Array存儲方式及對象Object

    一、數(shù)組的存儲 1、當聲明一個變量時,var a = 111; 在后臺計算機翻譯時,var聲明 a變量 所以此時會產生一個棧內存,變量 a 的初始值為undefined,然后 = 111 ; undefined消失,111的值被賦值給了a。如果多個變量賦值的話,棧內存的執(zhí)行順序是先進后出的順序。也叫做壓棧。棧內存

    2024年02月08日
    瀏覽(24)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領取紅包

二維碼2

領紅包