JavaScript的Proxy對象詳解
更新時間:2022年01月07日 15:26:57 作者:Learn-anything
這篇文章主要為大家介紹了JavaScript的Proxy對象,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
一、Proxy 是什么?
Proxy 對象用于攔截并修改目標對象的指定操作。
// 語法 const p = new Proxy(target, handler)
- target :目標對象(可以是任何類型的對象,包括原生數(shù)組,函數(shù),甚至另一個代理)。
- handler :以函數(shù)作為屬性的對象,實現(xiàn)攔截和自定義操作。
二、怎么用?
1、使用 Proxy 的簡單實例
訪問不存在的屬性,設(shè)置默認值返回而不返回 undefined
// 1、找到合適的 handler 并編寫代碼
const handler = {
get: function(obj, prop) {
return prop in obj ? obj[prop] : 37;
}
};
// 2、新建 Proxy 對象
const p = new Proxy({}, handler);
// 3、執(zhí)行操作
p.a = 1;
p.b = undefined;
// 4、查看結(jié)果
console.log(p.a, p.b); // 1, undefined
console.log('c' in p, p.c); // false, 37
2、目標對象被正確修改
let target = {};
let p = new Proxy(target, {});
p.a = 37; // 操作轉(zhuǎn)發(fā)到目標
console.log(target.a); // 37. 操作已經(jīng)被正確地轉(zhuǎn)發(fā)
3、使用 set handler 做數(shù)據(jù)驗證
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');
}
}
// The default behavior to store the value
obj[prop] = value;
// 表示成功
return true;
}
};
let person = new Proxy({}, validator);
person.age = 100;
console.log(person.age);
// 100
person.age = 'young';
// 拋出異常: Uncaught TypeError: The age is not an integer
person.age = 300;
// 拋出異常: Uncaught RangeError: The age seems invalid
4、擴展構(gòu)造函數(shù)
function extend(sup, base) {
var descriptor = Object.getOwnPropertyDescriptor(
base.prototype, "constructor"
);
base.prototype = Object.create(sup.prototype);
var handler = {
construct: function(target, args) {
var obj = Object.create(base.prototype);
this.apply(target, obj, args);
return obj;
},
apply: function(target, that, args) {
sup.apply(that, args);
base.apply(that, args);
}
};
var proxy = new Proxy(base, handler);
descriptor.value = proxy;
Object.defineProperty(base.prototype, "constructor", descriptor);
return proxy;
}
var Person = function (name) {
this.name = name
};
var Boy = extend(Person, function (name, age) {
this.age = age;
});
Boy.prototype.sex = "M";
var Peter = new Boy("Peter", 13);
console.log(Peter.sex); // "M"
console.log(Peter.name); // "Peter"
console.log(Peter.age); // 13
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
JavaScript尾遞歸的實現(xiàn)及應(yīng)用場景
本文主要介紹了JavaScript尾遞歸的實現(xiàn)及應(yīng)用場景,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
使用Axios攔截器優(yōu)化HTTP請求與響應(yīng)的實踐案例
在前端開發(fā)中,HTTP 請求是與后端交互的重要方式,為了提高代碼的可維護性、復(fù)用性以及用戶體驗,使用 Axios 攔截器是非常常見的做法,本文將詳細介紹如何使用 Axios 的請求攔截器和響應(yīng)攔截器,需要的朋友可以參考下2024-11-11
動態(tài)的改變IFrame的高度實現(xiàn)IFrame自動伸展適應(yīng)高度
動態(tài)的改變IFrame的高度,實現(xiàn)IFrame自動伸展,父頁面也自動神縮原理: 在IFrame子頁面一加載的時候,調(diào)用父IFrame對象,改變其高度2012-12-12

