ES6个人笔记记录——Proxy2

Proxy实例的方法

1.get
let person = {
	name: "wjy"
};

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

console.log(proxy1.name, proxy1.age);

get方法可以被继承

let proto = new Proxy({}, {
	get(target, propertyKey, receiver) {
		console.log("GET", propertyKey);
		return target[propertyKey]
	}
});

const {
	create
} = Object;
const {
	get
} = Reflect;
let obj1 = create(proto);
obj1.xxx;

使用get拦截实现数组读取负数索引

function createArray(...elements) {
	let handler = {
		get(target, propKey, receiver) {
			let index = Number(propKey);
			if (index < 0) {
				propKey = String(target.length + index);
			}
			return get(target, propKey, receiver);
		}
	};

	let target = [];
	target.push(...elements);
	return new Proxy(target, handler);
};

let arr1 = createArray('a', 'b', 'c');
let arr2 = ['a', 'b', 'c'];
console.log(arr1[-1], arr2[-1]);

利用Proxy,可以将读取属性的操作(get)转变为执行某个函数,从而实现属性的链式操作

let pipe = (function() {
	return function(value) {
		let funcStack = [];
		let oproxy = new Proxy({}, {
			get: function(pipeObject, fnName) {
				try {
					funcStack.push(window[fnName]);
					return oproxy;

				} catch {
					if (fnName === 'get') {
						return funcStack.reduce(function(val, fn) {
							return fn(val);
						}, value);
					}
				}
			}
		});

		return oproxy;
	}
}());

let double = n => n * 2;
let pow = n => n * n;
let reverseInt = n => n.toString().split("").reverse().join("") | 0;
// pipe(3).double.pow.reverseInt.get;

set()方法用来拦截某个属性的赋值操作

const {	isInteger } = Number;
let validator = {
	set: function(obj, prop, value) {
		if (prop === 'age') {
			if (isInteger(value)) {
				throw new Error("The age is not a integer");
			}
			if (value > 200) {
				throw new Error("The age invalid");
			}
			// 对于age以外的属性,直接保存
			obj[prop] = value;
		}
	}
};

let person1 = new Proxy({}, validator);
console.log(person1.age = 100);
// console.log(person1.age = 'young')
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值