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

MDN Proxy

本文作者starof,因知识本身在变化,作者也在不断学习成长,文章内容也不定时更新,为避免误导读者,方便追根溯源,请诸位转载注明出处:http://www.cnblogs.com/starof/p/6919862.html有问题欢迎与我讨论,共同进步。

es6 Proxy的更多相关文章

  1. ES6 Proxy 性能之我见

    ES6 Proxy 性能之我见 本文翻译自https://thecodebarbarian.com/thoughts-on-es6-proxies-performance Proxy是ES6的一个强力 ...

  2. Vue3.0 响应式数据原理:ES6 Proxy

    Vue3.0 开始用 Proxy 代替 Object.defineProperty了,这篇文章结合实例教你如何使用Proxy 本篇文章同时收录[前端知识点]中,链接直达 阅读本文您将收获 JavaSc ...

  3. ES6 Proxy和Reflect(下)

    construct() construct方法用于拦截new命令. var handler = { construct (target, args) { return new target(...ar ...

  4. ES6 Proxy和Reflect (上)

    Proxy概述 Proxy用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种"元编程"(meta programming),即对编程语言进行编程. Proxy可以理 ...

  5. es6 proxy代理

    es6 新增构造函数 Proxy Proxy 构造函数,可以使用new 去创建,可以往里面插入两个参数,都是对象 let target = {} let handler = {} let proxy ...

  6. ES6 Proxy的应用场景

    一.相关API Proxy Reflect 二.Proxy应用场景 1.数据校验 表单提交的时候做数据校验,例如年龄是不是满足条件,数据类型是不是满足要求等等,这场场景非常适合使用Proxy. 下面展 ...

  7. es6 Proxy对象详解

    Proxy用于修改某些操作的默认行为,也可以理解为在目标对象之前架设一层拦截,外部所有的访问都必须先通过这层拦截,因此提供了一种机制,可以对外部的访问进行过滤和修改.这个词的原理为代理,在这里可以表示 ...

  8. 新的知识点来了-ES6 Proxy代理 和 去银行存款有什么关系?

    ES给开发者提供了一个新特性:Proxy,就是代理的意思.也就是我们这一节要介绍的知识点. 以前,ATM还没有那么流行的时候(暴露年纪),我们去银行存款或者取款的时候,需要在柜台前排队,等柜台工作人员 ...

  9. es6 Proxy简单使用

    es6的Proxy是什么? 可以理解为,是在访问对象前的一层拦截.只要访问的该对象,就要通过这个一层拦截.这一层的拦截,可以进行数据的过滤和更改 比如下面这个 var p = new Proxy({} ...

随机推荐

  1. js垃圾回收(转

    和C#.Java一样JavaScript有自动垃圾回收机制,也就是说执行环境会负责管理代码执行过程中使用的内存,在开发过程中就无需考虑内存分配及无用内存的回收问题了.JavaScript垃圾回收的机制 ...

  2. UDP/TCP拾遗

    1.UDP的特点 (1)UDP 是无连接的,即发送数据之前不需要建立连接. (2)UDP 使用尽最大努力交付,即不保证可靠交付,同时也不使用拥塞控制. (3)UDP 是面向报文的.UDP 没有拥塞控制 ...

  3. 6-CSS

    HTML Style Tags CSS stands for Cascading Style Sheets. CSS describes how HTML elements are to be dis ...

  4. druid:java代码创建连接池

    PropertiesDB 是一个读取配置文件的类,也可以不用,每个参数直接用String代替. public DataSource dataSource(PropertiesDB properties ...

  5. 【算法】二分查找法&大O表示法

    二分查找 基本概念 二分查找是一种算法,其输入是一个有序的元素列表.如果要查找的元素包含在列表中,二分查找返回其位置:否则返回null. 使用二分查找时,每次都排除一半的数字 对于包含n个元素的列表, ...

  6. elasticsearch中的java.io.IOException: 远程主机强迫关闭了一个现有的连接

    [2018-07-31T14:29:41,289][WARN ][o.e.x.s.t.n.SecurityNetty4HttpServerTransport] [9rTGh-y] caught exc ...

  7. 基于ARM Cortex-M和Eclipse的SWO单总线输出

    最近在MCU on Eclipse网站上看到Erich Styger所写的一篇有关通过SWD的跟踪接口SWO获取ARM Cortex-M相关信息的文章,文章结构明晰,讲解透彻,本人深受启发,特意将其翻 ...

  8. 【shell】两种字符串提取场景的实现

    shell虽然比batch顺眼点儿,但还是老话,入门容易,精通难. 1.场景一是这样的,现有字符串的内容 name: tiger; age:18; location:china; 需求:提取每个属性的 ...

  9. python之内置模块random(转载)

    转载自http://www.cnblogs.com/wcwnina/p/9281334.html random.seed(a=None, version=2) # 初始化伪随机数生成器,若种子a相同, ...

  10. ORM 对象关系映射

    ORM (object relation mapping) 就是将对象数据转换为sql语句并执行 对象关系映射框架 orm 需要做的事情 1 生成创建表的语句 2 插入数据的语句 3 删除数据的语句 ...