es6 Proxy
proxy在语言层面去操作一个对象
var user={};
user.fname='Bob';
user.lname="Wood";
user.fullName= function () {
console.log(this.fname+" "+this.lname);
}
user.fullName();//Bob Wood
现在要做到user.fullName就让它去显示。
proxy接收2个参数,第一个是对象{},第二个也是个{}。
var user = new Proxy({}, {
get: function (obj, prop) {
return obj.fname + " " + obj.lname;
}
});
user.fname = 'Bob';
user.lname = "Wood";
console.log("user.fullName:" + user.fullName); //user.fullName:Bob Wood
此时没有对传入get方法中的prop做判断。所以哪怕输入一个user.age也会输出:Bob Wood
console.log("user.age:" + user.age); //user.age:Bob Wood
所以做一个判断,如果prop是full_name就输出全名
var user = new Proxy({}, {
get: function (obj, prop) {
if(prop=='full_name'){
return obj.fname + " " + obj.lname;
}
}
});
user.fname = 'Bob';
user.lname = "Wood";
console.log("user.full_name:" + user.full_name); //user.full_name:Bob Wood
console.log("user.age:" + user.age); //user.age:undefined
也可以通过switch对多个prop进行处理
var user = new Proxy({}, {
get: function (obj, prop) {
switch (prop){
case 'full_name':
return obj.fname + " " + obj.lname;
case 'age':
return obj.age;
}
}
});
user.fname = 'Bob';
user.lname = "Wood";
user.age="25";
console.log("user.full_name:" + user.full_name); //user.full_name:Bob Wood
console.log("user.age:" + user.age); //user.age:25
总结:get就像一层过滤器一样,obj在取值前加了一层,在对象提取值之前做一些操作。
除了get,也可以用set在设置属性时做一层处理。
var user = new Proxy({}, {
get: function (obj, prop) {
switch (prop) {
case 'full_name':
return obj.fname + " " + obj.lname;
case 'age':
return obj.age;
}
}, set: function (obj, prop,value) {//针对不同属性set值
switch (prop) {
case 'age':
obj.age=value+"岁";
break;
default:
obj[prop]=value; //age之外的属性直接保存
break;
}
}
});
user.fname = 'Bob';
user.lname = "Wood";
user.age = "25";
console.log("user.full_name:" + user.full_name); //user.full_name:Bob Wood
console.log("user.age:" + user.age); //user.age:25岁
除了get ,set 还有一些方法如下:
var handler =
{
// target.prop
get: ...,
// target.prop = value
set: ...,
// 'prop' in target
has: ...,
// delete target.prop
deleteProperty: ...,
// target(...args)
apply: ...,
// new target(...args)
construct: ...,
// Object.getOwnPropertyDescriptor(target, 'prop')
getOwnPropertyDescriptor: ...,
// Object.defineProperty(target, 'prop', descriptor)
defineProperty: ...,
// Object.getPrototypeOf(target), Reflect.getPrototypeOf(target),
// target.__proto__, object.isPrototypeOf(target), object instanceof target
getPrototypeOf: ...,
// Object.setPrototypeOf(target), Reflect.setPrototypeOf(target)
setPrototypeOf: ...,
// for (let i in target) {}
enumerate: ...,
// Object.keys(target)
ownKeys: ...,
// Object.preventExtensions(target)
preventExtensions: ...,
// Object.isExtensible(target)
isExtensible :...
}
参考:http://wiki.jikexueyuan.com/project/es6/object.html
本文作者starof,因知识本身在变化,作者也在不断学习成长,文章内容也不定时更新,为避免误导读者,方便追根溯源,请诸位转载注明出处:http://www.cnblogs.com/starof/p/6919862.html有问题欢迎与我讨论,共同进步。
es6 Proxy的更多相关文章
- ES6 Proxy 性能之我见
ES6 Proxy 性能之我见 本文翻译自https://thecodebarbarian.com/thoughts-on-es6-proxies-performance Proxy是ES6的一个强力 ...
- Vue3.0 响应式数据原理:ES6 Proxy
Vue3.0 开始用 Proxy 代替 Object.defineProperty了,这篇文章结合实例教你如何使用Proxy 本篇文章同时收录[前端知识点]中,链接直达 阅读本文您将收获 JavaSc ...
- ES6 Proxy和Reflect(下)
construct() construct方法用于拦截new命令. var handler = { construct (target, args) { return new target(...ar ...
- ES6 Proxy和Reflect (上)
Proxy概述 Proxy用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种"元编程"(meta programming),即对编程语言进行编程. Proxy可以理 ...
- es6 proxy代理
es6 新增构造函数 Proxy Proxy 构造函数,可以使用new 去创建,可以往里面插入两个参数,都是对象 let target = {} let handler = {} let proxy ...
- ES6 Proxy的应用场景
一.相关API Proxy Reflect 二.Proxy应用场景 1.数据校验 表单提交的时候做数据校验,例如年龄是不是满足条件,数据类型是不是满足要求等等,这场场景非常适合使用Proxy. 下面展 ...
- es6 Proxy对象详解
Proxy用于修改某些操作的默认行为,也可以理解为在目标对象之前架设一层拦截,外部所有的访问都必须先通过这层拦截,因此提供了一种机制,可以对外部的访问进行过滤和修改.这个词的原理为代理,在这里可以表示 ...
- 新的知识点来了-ES6 Proxy代理 和 去银行存款有什么关系?
ES给开发者提供了一个新特性:Proxy,就是代理的意思.也就是我们这一节要介绍的知识点. 以前,ATM还没有那么流行的时候(暴露年纪),我们去银行存款或者取款的时候,需要在柜台前排队,等柜台工作人员 ...
- es6 Proxy简单使用
es6的Proxy是什么? 可以理解为,是在访问对象前的一层拦截.只要访问的该对象,就要通过这个一层拦截.这一层的拦截,可以进行数据的过滤和更改 比如下面这个 var p = new Proxy({} ...
随机推荐
- 设计模式C++学习笔记之十(Builder建造者模式)
建造者模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.一段晦涩难懂的文字,实现创建不同表示的方法就是给创建的过程传入创建的参数.详细的还是看代码吧. 10.1.解释 ...
- Ubuntu16.04用源安装Nginx+PHP5.6+MySQL5.6
安装Nginx 1.首先添加nginx_signing.key(必须,否则出错) $ wget http://nginx.org/keys/nginx_signing.key $ sudo apt-k ...
- 添加struts2本地dtd限制
将源码保重的struts-2.1.7.dtd文件拷贝到dtds文件夹中 打开eclipse配置文件window/preferences,搜索xml找到XML Catalog
- Light OJ 1012
经典搜索水题...... #include<bits/stdc++.h> using namespace std; const int maxn = 20 + 13; const int ...
- python中的各种锁
一.全局解释器锁(GIL) 1.什么是全局解释器锁 在同一个进程中只要有一个线程获取了全局解释器(cpu)的使用权限,那么其他的线程就必须等待该线程的全局解释器(cpu)使 用权消失后才能使用全局解释 ...
- STM32L476应用开发之五:数据保存与SD卡操作
便携式气体分析仪的特点就是离线运行.尽管是离线运行,但测试数据还是需要的,所以采取方式保存数据就是必须的.在本次项目中我们计划采用SD卡来保存数据. 1.硬件设计 该读卡器整合 SD 卡规范和 FAT ...
- python 排序 sort和sorted
当我们从数据库中获取一写数据后,一般对于列表的排序是经常会遇到的问题,今天总结一下python对于列表list排序的常用方法: 第一种:内建方法sort() 可以直接对列表进行排序 用法: list. ...
- The word 'localhost' is not correctly spelled 这个问题怎么解决
The word 'localhost' is not correctly spelled 这个问题怎么解决 有时工程中有下划线并提示 The word is not correctly spelle ...
- Spring如何使用JdbcTemplate调用存储过程的三种情况
注:原文 <Spring如何使用JdbcTemplate调用存储过程的三种情况 > Spring的SimpleJdbcTemplate将存储过程的调用进行了良好的封装,下面列出使用Jdbc ...
- Confluence 6 隐藏人员目录
人员目录提供了你 Confluence 中所有用户的列表. 如果你希望禁用人员目录,请在你应用程序命令行中的 Configuring System Properties 进行设置. 希望为匿名用户禁用 ...