Object.defineProperties()

了不起啊。。vue.js通过它实现双向绑定的

Object.defineProperties(obj,props) 方法直接在一个对象上定义新的属性或修改现有属性 并返回该对象

参数

obj在其上定义或修改属性的对象

props要定义其可枚举属性或修改的属性描述符的对象。对象中存在的属性描述符主要有两种:数据描述符和访问器

描述符具有以下键:

  configurable
true 当且仅当该属性描述符的类型可以被改变并且该属性可以从对应对象中删除
默认为 false
  enumerable
true 当且仅当在枚举相应对象上的属性时该属性显现
默认为 false
  value
与属性关联的值。可以是任何有效的JavaScript值(数字,对象,函数等)
默认为 undefined.
  writable
true当且仅当与该属性相关联的值可以用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参数

targetProxy包装的目标对象(要被代理的对象可以是任何类型的对象 包括原生数组 函数 甚至另一个代理)

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对象代理的更多相关文章

  1. Object.defineProperties——MEAN开发后台的Model层

    Object.defineProperties是什么?有什么用? 这个问题比较听起来可能比较难以理解,确实我也是在项目中遇到的才会去想.以前看到<高级程序设计>的时候,有这么一种东西,定义 ...

  2. 分享一个Object.defineProperties 定义一个在原对象可读可写的方法

    function A(){ this.name = 'hellow word'; } Object.defineProperties( A.prototype,{ doSomething2 : { v ...

  3. js中Object.defineProperties 定义一个在原对象可读可写的方法

    function A(){ this.name = 'hellow word'; } Object.defineProperties( A.prototype,{ doSomething2 : { v ...

  4. es6 Proxy对象详解

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

  5. Inside Flask - globals 全局变量(对象代理)

    Inside Flask - globals 全局变量(对象代理) 框架是一个容器,在框架内编程,一般是要遵守框架的约定和使用模式.通常这样的模式是 IoC,即由框架调用用户的代码,而不是用户调用框架 ...

  6. 在spring中获取代理对象代理的目标对象工具类

    昨天晚上一哥们需要获取代理对象的目标对象,查找了文档发现没有相应的工具类,因此自己写了一个分享给大家.能获取JDK动态代理/CGLIB代理对象代理的目标对象. 问题描述:: 我现在遇到个棘手的问题,要 ...

  7. 获取JDK动态代理/CGLIB代理对象代理的目标对象。

    问题描述:: 我现在遇到个棘手的问题,要通过spring托管的service类保存对象,这个类是通过反射拿到的,经过实验发现这个类只能反射取得sservice实现了接口的方法,而extends类的方法 ...

  8. es6学习笔记-proxy对象

    前提摘要 尤大大的vue3.0即将到来,虽然学不动了,但是还要学的啊,据说vue3.0是基于proxy来进行对值进行拦截并操作,所以es6的proxy也是要学习一下的. 一 什么是proxy Prox ...

  9. 设计模式之Proxy(代理)(转)

    理解并使用设计模式,能够培养我们良好的面向对象编程习惯,同时在实际应用中,可以如鱼得水,享受游刃有余的乐趣. Proxy是比较有用途的一种模式,而且变种较多,应用场合覆盖从小结构到整个系统的大结构,P ...

随机推荐

  1. forall 与 for loop 案例

    create table a_tab(ver number,id number);create table b_tab(ver number,id number);set timing on DECL ...

  2. Nginx 反向代理 -- 一路上的坑转载

    个人学习之用转子https://www.cnblogs.com/xjbBill/p/7477825.html 前些天刚过来新公司上班,公司的项目都挺多的,只不过项目都是第三方公司团队开发的,现在本公司 ...

  3. Linux:Day6(上) egrep、条件测试

    egrep及扩展的正则表达式: egrep = grep -E 扩展正则表达式的元字符: 或者:a | b 练习: 1.显示当前系统root.centos或user1用户的默认shell和UID: 2 ...

  4. java 图片转换成base64字符串

    import java.io.ByteArrayOutputStream; import java.io.FileInputStream;import java.io.FileOutputStream ...

  5. 应对WannaCry勒索危机之关闭445端口等危险端口——以本人Windows7系统为例

    应对WannaCry勒索危机之关闭445端口等危险端口--以本人Windows7系统为例 近日,全球范围内爆发WannaCry勒索病毒危机 我国很多大学纷纷中招.受灾严重,甚至连刘老师的电脑也-- 拿 ...

  6. list.remove操作注意点

    通过源码分析一下结果public class Test { public static void main(String[] args) { // test1(); // test2(); test3 ...

  7. Feature Extractor[googlenet v1]

    1 - V1 google团队在模型上,更多考虑的是实用性,也就是如何能让强大的深度学习模型能够用在嵌入式或者移动设备上.传统的想增强模型的方法无非就是深度和宽度,而如果简单的增加深度和宽度,那么带来 ...

  8. Git超实用总结,再也不怕记忆力不好了

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯工蜂发表于云+社区专栏 Git 是什么? Git 是一个分布式的代码管理容器,本地和远端都保有一份相同的代码. Git 仓库主要是 ...

  9. quartz获取缓存中所有运行中的Job

    原文地址:https://blog.csdn.net/zzm8421/article/details/77769203 Quartz 2.1.5: public static void getAllJ ...

  10. nodejs图片处理工具gm用法

    在做H5应用中,有时候会涉及到一些图片加工处理的操作,nodejs有一个很好的后台图片处理module,就是这里说的gm.gm有官方文档,但感觉写得太抽象,反而看不懂了.这里把一些常见的用法写下,供大 ...