【ES6】---JavaScript(三)

一、proxy介绍

Proxy(代理) 是 ES6 中新增的一个特性。

作用:在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。很类似于设计模式中的代理模式

二、基本用法

let p = new Proxy(target,handler)

  

参数:

target 是用Proxy包装的被代理对象(可以是任何类型的对象,包括原生数组,函数,甚至另一个代理)。

handler 是一个对象,其声明了代理target 的一些操作,其属性是当执行一个操作时定义代理的行为的函数。

特点:

  • 可以劫持整个对象,并返回一个新对象
  • 有13种劫持操作
  • handler代理的一些常用的方法有如下几个:
    • get:读取
    • set:修改
    • has:判断对象是否有该属性
    • construct:构造函数
    • apply:当目标对象是一个函数的时候
    • deleteProperty: 用于拦截delete操作

三、get/set方法

    var target = {
        name:"Alley",
        age:19,
        sex:"男"
    }

    var p = new Proxy(target,{
        get(obj,attr){
            console.log("属性被访问了");
        },
        set(obj,attr,value){
            console.log("属性被设置了");
        }
    })
    p.name;
    p.name = "巷子";

  

get函数:当访问target对象身上的一些属性的时候就会触发get函数,get函数接收2个参数

参数1:代理的对象也就是target

参数2:访问的属性

set函数: 当设置target对象身上的一些属性的时候就会触发set函数,set函数接收3个参数

参数1:代理的对象

参数2:设置对象的属性

参数3:设置对象属性的值

四、get/set使用场景

1、虚拟属性

var target = {
    firstName:"张",
    lastName:"小凡"
}

var p = new Proxy(target,{
    get(obj,attr){
        if(attr == "fullName"){
            return [obj.firstName,obj.lastName].join("");
        }
        return obj[attr]
    },
    set(obj,attr,value){
        if(attr == "fullName"){
            var fullNameInfo = value.split(" ");
            obj.firstName = fullNameInfo[0];
            obj.lastName = fullNameInfo[1];
        }else{
            obj[attr] = value;
        }
    }
})

console.log(p.fullName);//张小凡
p.fullName = "小 甜甜";
console.log(p.firstName);//小
console.log(p.lastName);//甜甜

  

2、私有属性

//把_开头的变量都认为私有变量

var target = {
    name:"张三",
    age:19,
    _sex:"女"
}

var p = new Proxy(target,{
    get(obj,attr){
        if(attr.startsWith("_")){
            console.log("私有属性不允许被访问");
            return false;
        }

        return obj[attr];
    },
    set(obj,attr,value){
        if(attr.startsWith("_")){
            console.log("私有属性不允许被设置");
            return false;
        }
        obj[attr] = value;
    },
    has(obj,attr){
        if(attr.startsWith("_")){
            return false;
        }
        return (attr in obj);
    }
})

  

五、函数拦截

 

apply:当目标对象是一个函数,且它被调用时,就是被apply方法拦截。

参数:apply(target,context,arguments)

target:目标对象

context:目标对象的上下文对象(this)

arguments:目标对象的参数数组

construct:construct方法用于拦截new命令,意思就是你在new目标对象的时候,会走constrcut(){}这里。

参数:construct(target,arguments)

target:目标对象

arguments:构造函数的参数对象

  function fn(a,b){}

    var handler = {
        apply: function (target, context, args) {
            console.log(target, context, args)
            return args[0];
        },

        construct: function (target, args) {
            return { value: args[1] };
        }
    };

    var p = new Proxy(fn,handler);

    console.log(p(1,2)) //1
    console.log(new p(1,2)) // {value:2}

  

https://www.cnblogs.com/yuanjili666/p/11683393.html

原文地址:https://www.cnblogs.com/yuanjili666/p/11683392.html

时间: 2024-10-09 14:22:24

【ES6】---JavaScript(三)的相关文章

关于阮一峰老师es6(第三版)中管道机制代码的理解浅析

最近正在学习阮一峰老师的es6(第三版)教材,在学到第七章<函数的扩展>中的箭头函数嵌套时,文中提到了一个关于“管道机制”的示例,文中源代码如下: //es6(第三版)教材中的管道机制源代码: const pipeline = (...funcs) => val => funcs.reduce((a, b) => b(a), val); const plus1 = a => a + 1; const mult2 = a => a * 2; const addThe

ES6:JavaScript 新特性

5月14日,国务院发布了<国务院关于同意建立深化收入分配制度改革部际联席会议制度的批复>,同意建立由发改委牵头的深化收入分配制度改革部际联席会议制度.这是对政府一年多前首次发布的关于收入分配制度改革若干意见的落实,标志着中国收入分配改革迈出了实质性一步.根据批复,联席会议由国家发改委.财政部.人力资源和社会保障部等21个部门和单位组成.发改委主任徐绍史担任联席会议召集人,其他成员单位有关负责人为联席会议成员. 国务院下发的文件显示,部际联席会议制度的主要职责包括:在国务院领导下,统筹协调做好深

数据结构与算法JavaScript (三) 链表

数据结构与算法JavaScript (三) 链表 我们可以看到在javascript概念中的队列与栈都是一种特殊的线性表的结构,也是一种比较简单的基于数组的顺序存储结构.由于 javascript的解释器针对数组都做了直接的优化,不会存在在很多编程语言中数组固定长度的问题(当数组填满后再添加就比较困难了,包括添加删除, 都是需要把数组中所有的元素全部都变换位置的,javascript的的数组确实直接给优化好了,如 push,pop,shift,unshift,split方法等等…) 线性表的顺序

javascript 三种数组复制方法的性能对比

javascript 三种数组复制方法的性能对比,对于webkit, 使用concat; 其他浏览器, 使用slice. 一. 三种数组复制方法 1. by slice var arr = [1, 2, 3], copyArr; copyArr = arr.slice(); 2. by concat var arr = [1, 2, 3], copyArr; copyArr = arr.concat(); 3. by loop var arr = [1, 2, 3], copyArr = [];

es6 javascript对象方法Object.assign()

es6 javascript对象方法Object.assign() 2016年12月01日 16:42:34 阅读数:38583 1  基本用法 Object.assign方法用于对象的合并,将源对象( source )的所有可枚举属性,复制到目标对象( target ). [javascript] view plain copy var target = { a: 1 }; var source1 = { b: 2 }; var source2 = { c: 3 }; Object.assig

JavaScript学习笔记 -- ES6学习(三) 变量的解构赋值

1.解构赋值的定义 在ES6中,允许按照一定模式,从数组和对象中提取值(所谓解构),然后对变量进行赋值. var a = 1; var b = 2; var c = 3; //等价于 var [a, b, c] = [1, 2, 3]; 如果解构不成功,对应的变量就会赋值undefined. let [x, y, ...z] = ['a']; x // "a" y // undefined z // [] 另一种情况是不完全解构,即等号左边的模式,只匹配一部分的等号右边的数组.这种情况

es6 javascript的Iterator 和 for...of 循环

1 Iterator( 遍历器) 的概念 JavaScript 原有的表示" 集合" 的数据结构, 主要是数组( Array) 和对象( Object), ES6 又添加了 Map 和 Set. 这样就有了四种数据集合, 用户还可以组合使用它们, 定义自己的数据结构, 比如数组的成员是 Map, Map 的成员是对象. 这样就需要一种统一的接口机制, 来处理所有不同的数据结构. 遍历器( Iterator) 就是这样一种机制. 它是一种接口, 为各种不同的数据结构提供统一的访问机制.

JavaScript 三种创建对象的方法

JavaScript中对象的创建有以下几种方式: (1)使用内置对象 (2)使用JSON符号 (3)自定义对象构造 一.使用内置对象 JavaScript可用的内置对象可分为两种: 1,JavaScript语言原生对象(语言级对象),如String.Object.Function等: 2,JavaScript运行期的宿主对象(环境宿主级对象),如window.document.body等. 我们所说的使用内置对象,是指通过JavaScript语言原生对象的构造方法,实例化出一个新的对象.如: 代

从零开始学JavaScript三(变量)

一.变量 ECMAscript变量是松散型变量,所谓松散型变量,就是变量名称可以保存任何类型的数据,每个变量仅仅是一个用于保存值的占位符. 定义变量时要使用var操作符 如: var message; /*定义一个名为message的变量,该变量可以用来保存任何值,未初始化的变*量会保存一个特殊的值-undefined */ 二.局部变量 可以声明变量里同时初始化 function test(){ var message='hello'; //定义局部message变量,并初始值为hello a