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. UVA12188-Inspector's Dilemma(欧拉回路+连通性判断)

    Problem UVA12188-Inspector's Dilemma Time Limit: 3000 mSec Problem Description In a country, there a ...

  2. (二 -5) 天猫精灵接入Home Assistant-自动发现Mqtt设备--电风扇

    官网:https://www.home-assistant.io/components/fan.mqtt/ 1 添加配置文件 要在安装中启用MQTT风扇,请将以下内容添加到您的configuratio ...

  3. class文件魔数CAFEBABE的由来

    https://blog.csdn.net/ustcyy91/article/details/78462378 https://blog.csdn.net/renfufei/article/detai ...

  4. [MicroPython]TPYBoardv102超全DIY案例一览

    TPYBoardv102是一款比较成熟和经典的MicroPython开发板,不仅适用于学习实验还能应用于大型的工业级开发,是MicroPython入门和研发的不二之选.下面我们就扒开v102的“层层外 ...

  5. HTTP与HTTPS对访问速度(性能)的影响

    1 前言 HTTPS 在保护用户隐私,防止流量劫持方面发挥着非常关键的作用,但与此同时,HTTPS 也会降低用户访问速度,增加网站服务器的计算资源消耗. 本文主要介绍 https 对用户体验的影响. ...

  6. docker学习(1)--基础概念

    转载请注明源文章出处:http://www.cnblogs.com/lighten/p/6841677.html 1.前言 docker的官网:这里.下一段摘自官网描述. docker是世界领先的软件 ...

  7. c# 设置IE浏览器版本运行程序-设置webBrowser对应的IE内核版本来运行

    //通常情况下,我们直接调用C#的webBrowser控件,默认的浏览器内核是IE7.  那么如何修改控件调用的默认浏览器版本呢?using System; using System.Collecti ...

  8. CSS实现树形结构 + js加载数据

    看到一款树形结构,比较喜欢它的样式,就参照它的外观自己做了一个,练习一下CSS. 做出来的效果如下: li { position: relative; padding: 5px 0; margin:0 ...

  9. 对写博客的n种思考

    喜欢才能坚持 开始写博客的原因非常功利,功利到不好意思说. 反正你们也懂的,就那么几种. 问题是,如果心态一直这么功利,而写博客的前期回报几乎为零,情绪会变得沮丧,不知如何继续. 不过后来想想,其实做 ...

  10. 从 0 到 1 实现 react - 9.onChange 事件以及受控组件

    该系列文章在实现 cpreact 的同时理顺 React 框架的核心内容 项目地址 从一个疑问点开始 接上一章 HOC 探索 抛出的问题 ---- react 中的 onChange 事件和原生 DO ...