Object.defineProperties()与Proxy对象代理
Object.defineProperties()
了不起啊。。vue.js通过它实现双向绑定的
Object.defineProperties(obj,props) 方法直接在一个对象上定义新的属性或修改现有属性 并返回该对象
参数
obj在其上定义或修改属性的对象
props要定义其可枚举属性或修改的属性描述符的对象。对象中存在的属性描述符主要有两种:数据描述符和访问器
描述符具有以下键:
configurabletrue当且仅当该属性描述符的类型可以被改变并且该属性可以从对应对象中删除
默认为falseenumerabletrue当且仅当在枚举相应对象上的属性时该属性显现
默认为false
value- 与属性关联的值。可以是任何有效的JavaScript值(数字,对象,函数等)
默认为undefined. writabletrue当且仅当与该属性相关联的值可以用assignment operator改变时
默认为false
get- 作为该属性的 getter 函数,如果没有 getter 则为
undefined。函数返回值将被用作属性的值
默认为undefined set- 作为属性的 setter 函数,如果没有 setter 则为
undefined。函数将仅接受参数赋值给该属性的新值
默认为undefined
var a= {}
Object.defineProperty(a,"b",{
value:123
})
console.log(a.b);//
第一个参数:目标对象
第二个参数:需要定义的属性或方法的名字
第三个参数:目标属性所拥有的特性(descriptor)
现在咱主要讲get跟set哈 !! (其他详情可参考MDN) https://developer.mozilla.org/zh-CN/
set 和 get
在 descriptor 中不能 同时设置访问器 (get 和 set) 和 wriable 或 value 否则会错 就是说想用(get 和 set) 就不能用(wriable 或 value中的任何一个)
set 和 get 他俩干啥用的
var a= {}
Object.defineProperty(a,"b",{
set:function(newValue){
console.log("你要赋值给我 我的新值是"+newValue)
},
get:function(){
console.log("你取我的值")
return 2 //注意这里 我硬编码返回2
}
})
a.b =1 //打印 你要赋值给我,我的新值是1
console.log(a.b) //打印 你取我的值
//打印 2 注意这里,和我的硬编码相同的
简单来说,, 这个 “b” 赋值 或者 取值的时候会分别触发 set 和 get 对应的函数 取值、赋值
JS proxy
Proxy 对象用于定义基本操作的自定义行为(如属性查找,赋值,枚举,函数调用等)
记得前一段时间用它实现过原生的双向数据绑定
<html>
<head>
</head>
<body>
<input type="text" id='ipt' oninput='handle()' />
<div id='txt'></div>
<button id='btn'>王瘦瘦</button>
<script>
var obj = {
mess:''"
} var proxy = new Proxy(obj, {
get: function(target) {
return target.mess;
},
set: function(target,key,value){
target.mess = value;
txt.innerHTML = proxy.mess;
}
}); function handle(){
var val = ipt.value;
//proxy添加了get和set方法
proxy.mess = val;
} btn.onclick = function(){
console.log(proxy.mess);
}
</script>
</body>
</html>
Proxy是ES6中提供的新的API 可以用来定义对象各种基本操作的自定义行为
(在文档中被称为traps我觉得可以理解为一个针对对象各种行为的钩子)
拿它可以做很多有意思的事情 在我们需要对一些对象的行为进行控制时将变得非常有效
Proxy参数
target用Proxy包装的目标对象(要被代理的对象可以是任何类型的对象 包括原生数组 函数 甚至另一个代理)
handler一个对象 其属性是当执行一个操作时定义代理的行为的函数(对该代理对象的各种操作行为处理)
语法
let target = {}
let handlers = {}
let proxy = new Proxy(target, handlers)
proxy.a = 123
console.log(target.a) //
在第二个参数为空对象的情况下 基本可以理解为是对第一个参数做的一次浅拷贝
(proxy是浅拷贝 只是做的对象的代理)
target是代理为数组扩展的实用工具 可以灵活的“定义”属性 而不需要使用Object.defineProperties方法
var docCookies = new Proxy(docCookies, {
"get": function (oTarget, sKey) {
return oTarget[sKey] || oTarget.getItem(sKey) || undefined;
},
"set": function (oTarget, sKey, vValue) {
if (sKey in oTarget) { return false; }
return oTarget.setItem(sKey, vValue);
},
"deleteProperty": function (oTarget, sKey) {
if (sKey in oTarget) { return false; }
return oTarget.removeItem(sKey);
},
"enumerate": function (oTarget, sKey) {
return oTarget.keys();
},
"ownKeys": function (oTarget, sKey) {
return oTarget.keys();
},
"has": function (oTarget, sKey) {
return sKey in oTarget || oTarget.hasItem(sKey);
},
"defineProperty": function (oTarget, sKey, oDesc) {
if (oDesc && "value" in oDesc) { oTarget.setItem(sKey, oDesc.value); }
return oTarget;
},
"getOwnPropertyDescriptor": function (oTarget, sKey) {
var vValue = oTarget.getItem(sKey);
return vValue ? {
"value": vValue,
"writable": true,
"enumerable": true,
"configurable": false
} : undefined;
},
});
/* Cookies 测试 */
alert(docCookies.my_cookie1 = "First value");
alert(docCookies.getItem("my_cookie1"));
docCookies.setItem("my_cookie1", "Changed value");
alert(docCookies.my_cookie1);
全部traps

在这里实现一个简单的对象保护 只读属性 实现数据的保护
let Person = {
name : "老赵",
age : 18
}
let person = new Proxy(Person,{
get(target,key){
return target[key] //读操作
},
set(target,key,value){
if(key !== "name"){
target[key] = value
}
}
})
//person.name = "王瘦瘦" //报错 不允许比老赵帅!!
Feeling so high but too far away
Object.defineProperties()与Proxy对象代理的更多相关文章
- Object.defineProperties——MEAN开发后台的Model层
Object.defineProperties是什么?有什么用? 这个问题比较听起来可能比较难以理解,确实我也是在项目中遇到的才会去想.以前看到<高级程序设计>的时候,有这么一种东西,定义 ...
- 分享一个Object.defineProperties 定义一个在原对象可读可写的方法
function A(){ this.name = 'hellow word'; } Object.defineProperties( A.prototype,{ doSomething2 : { v ...
- js中Object.defineProperties 定义一个在原对象可读可写的方法
function A(){ this.name = 'hellow word'; } Object.defineProperties( A.prototype,{ doSomething2 : { v ...
- es6 Proxy对象详解
Proxy用于修改某些操作的默认行为,也可以理解为在目标对象之前架设一层拦截,外部所有的访问都必须先通过这层拦截,因此提供了一种机制,可以对外部的访问进行过滤和修改.这个词的原理为代理,在这里可以表示 ...
- Inside Flask - globals 全局变量(对象代理)
Inside Flask - globals 全局变量(对象代理) 框架是一个容器,在框架内编程,一般是要遵守框架的约定和使用模式.通常这样的模式是 IoC,即由框架调用用户的代码,而不是用户调用框架 ...
- 在spring中获取代理对象代理的目标对象工具类
昨天晚上一哥们需要获取代理对象的目标对象,查找了文档发现没有相应的工具类,因此自己写了一个分享给大家.能获取JDK动态代理/CGLIB代理对象代理的目标对象. 问题描述:: 我现在遇到个棘手的问题,要 ...
- 获取JDK动态代理/CGLIB代理对象代理的目标对象。
问题描述:: 我现在遇到个棘手的问题,要通过spring托管的service类保存对象,这个类是通过反射拿到的,经过实验发现这个类只能反射取得sservice实现了接口的方法,而extends类的方法 ...
- es6学习笔记-proxy对象
前提摘要 尤大大的vue3.0即将到来,虽然学不动了,但是还要学的啊,据说vue3.0是基于proxy来进行对值进行拦截并操作,所以es6的proxy也是要学习一下的. 一 什么是proxy Prox ...
- 设计模式之Proxy(代理)(转)
理解并使用设计模式,能够培养我们良好的面向对象编程习惯,同时在实际应用中,可以如鱼得水,享受游刃有余的乐趣. Proxy是比较有用途的一种模式,而且变种较多,应用场合覆盖从小结构到整个系统的大结构,P ...
随机推荐
- 【移动端】单位em相关资料
https://www.cnblogs.com/koubazhuanshu/p/6985331.html https://www.w3cplus.com/css/px-to-em 不建议使用 作者:s ...
- bzoj-1787-洛谷-4281(LCA板子题)
传送门(bzoj) 传送门(洛谷) 可以说这道也是一个板子题 由于题中是三个人需经过的路径最短 就会有一点点不太一样 那么 就两两求LCA 这样之后就会出现两种状况 一.所得到的三个LCA是相等的 那 ...
- 面试官问,说一个你在工作非常有价值的bug
如果你去参考面试,做足了准备,面对面试官员从容不迫,吐沫横飞的大谈自己的工作经历.突然,面试官横插一句:说一个你在工作非常有价值的bug.顿时,整个空气都仿佛都凝固了!“What?”... 我想没几个 ...
- echarts 图例显示到右边
原: legend: { data:['同龄普通孩子','已具备技能','已泛化技能','已掌握技能','学习中'] }, 改: legend: { data:['同龄普通孩子','已具备技能','已 ...
- odoo11登录之后返回的session信息分析
{ "id": null, "jsonrpc": "2.0", "result": { "web_tours& ...
- 记上海技术交流会之行备忘录(superset与odoo整合)
像每个早上一样,早起跑步回来冲个热水澡,简单的吃下早饭,看书到8:50的样子,准备赶10:02分的火车.在我看到周总的微信时,我知道这将是一个新的起点,在自己过往的2年时间,将更多的精力和时间用在了英 ...
- 海纳百川而来的一篇相当全面的Java NIO教程
目录 零.NIO包 一.Java NIO Channel通道 Channel的实现(Channel Implementations) Channel的基础示例(Basic Channel Exampl ...
- JS 异步系列 —— Promise 札记
Promise 研究 Promise 的动机大体有以下几点: 对其 api 的不熟悉以及对实现机制的好奇; 很多库(比如 fetch)是基于 Promise 封装的,那么要了解这些库的前置条件得先熟悉 ...
- 无线网络中信噪比(SNR)计算
信噪比(S/N)=log[信号功率密度/噪声功率密度] a =log[信号功率密度]-log[噪声功率密度] 例如,接收端的信号功率密度为-63dBm,噪声的信号功率密度为-95dBm,则: 信噪比( ...
- Python-random模块-59
random模块: 随机数模块 >>> import random #随机小数 >>> random.random() # 大于0且小于1之间的小数 0.76643 ...