首页 > 其他分享 >万象更新 Html5 - es6 进阶: proxy, reflect

万象更新 Html5 - es6 进阶: proxy, reflect

时间:2024-09-24 11:47:37浏览次数:1  
标签:es6 console 进阶 Object 万象更新 Reflect proxy target log

源码 https://github.com/webabcd/Html5
作者 webabcd

万象更新 Html5 - es6 进阶: proxy, reflect

示例如下:

es6\src\advanced\proxy_reflect.js

// Proxy - 代理(拦截目标对象的属性操作和函数操作)
let target = {
    name: 'webabcd',
    age: 40,
    get hello() {
        return this.name + this.age;
    }
}
let handler = {
    get: function(target, propertyKey, receiver) { // receiver 就是 Proxy 实例本身
        console.log("get: "+ propertyKey);
        return target[propertyKey];
    },
    set: function(target, propertyKey, value, receiver) { // receiver 就是 Proxy 实例本身
        console.log("set: " + propertyKey);
        target[propertyKey] = value;
        return true; // 对于 handler 的 set() 来说,必须要有 return true
    },
    has: function(target, propertyKey){
        console.log("has: " + propertyKey);
        return propertyKey in target;
    }
    /*
     * 其他可代理的方法如下:
     * construct() - 执行 new Proxy() 时
     * getPrototypeOf() - 执行 Object.getPrototypeOf(proxy) 时
     * setPrototypeOf() - 执行 Object.setPrototypeOf(proxy) 时
     * preventExtensions() - 执行 Object.preventExtensions(proxy) 时
     * isExtensible() - 执行 Object.isExtensible(proxy) 时
     * defineProperty() - 执行 Object.defineProperty(proxy) 时
     * ownKeys() - 执行 Object.getOwnPropertyNames(proxy) 时
     * deleteProperty() - 执行 delete proxy.prop 时
     */
}
// Proxy - 让 handler 处理 target 的属性和方法
let proxy = new Proxy(target, handler);
proxy.name = "wanglei"; // 会走到 handler 的 set()
console.log(proxy.name); // 会走到 handler 的 get()
console.log("name" in proxy); // 会走到 handler 的 has()


// 通过 handler 的 apply() 代理函数的调用
function target2(a, b) {
    return a + b;
}
let handler2 = {
    apply: function(target, ctx, args) {
        console.log("apply: " + args.join(","));
        return target(...args);
    }
};
let proxy2 = new Proxy(target2, handler2);
console.log(proxy2(100, 50)); // 150


// 通过 handler 的 construct() 代理构造函数
function target3(a, b) {
    this.a = a;
    this.b = b;
    this.hello = function() {
        return this.a + this.b;
    }
}
let handler3 = {
    construct(target, argArray, newTarget) {
        console.log("construct: "+argArray.join(","));
        return new target(...argArray);
    }
};
let proxy3 = new Proxy(target3, handler3);
console.log(new proxy3(100, 50).hello()); // 150




// Reflect - 反射
let target4 = {
    name: 'webabcd',
    age: 40,
    get hello() {
        return this.name + this.age;
    }
}
// Reflect.get() - 获取指定对象的指定属性
console.log(Reflect.get(target4, "hello")); // wanglei40
// Reflect.get() - 获取指定对象的指定属性(对象中的 this 会指向 Reflect.get() 的第 3 个参数)
console.log(Reflect.get(target4, "hello", {name: "xyz"})); // xyzundefined
// Reflect.set() - 设置指定对象的指定属性
Reflect.set(target4, 'name', "abc");
console.log(Reflect.get(target4, "name")); // abc


function target5(a, b) {
    return a + b + this.x;
}
// Reflect.apply() - 调用指定的函数
//     第 1 个参数:目标函数
//     第 2 个参数:目标函数的 this 指向的对象
//     第 3 个参数:传入目标函数的参数列表
console.log(Reflect.apply(target5, {x:100}, [100, 50])); // 250


function target6(a, b) {
    this.a = a;
    this.b = b;
    this.hello = function() {
        return this.a + this.b;
    }
}
// Reflect.construct() - 调用构造函数并传参
let obj = Reflect.construct(target6, [100, 50]); // 150
console.log(obj.hello());


/*
 * 关于 Reflect 除了上面说的,还有如下:
 * 注:这些都可以在 Object 中找到相同的用法,可以参见 class/prototype.js 中的关于 Object 的相关说明以及 basic/object.js 中的关于 Object 的相关的说明
 * defineProperty() - 类似 Object.defineProperty()
 * deleteProperty() - 类似 delete obj.prop
 * getPrototypeOf() - 类似 Object.getPrototypeOf()
 * setPrototypeOf() - 类似 Object.setPrototypeOf()
 * preventExtensions() - 类似 Object.preventExtensions()
 * isExtensible() - 类似 Object.isExtensible()
 * ownKeys() - 类似 Object.getOwnPropertyNames()
 *
 * 注:能用 Reflect 的方法就用 Reflect 的,而不要再用 Object 的了
 */




// 通过 Proxy 和 Reflect 实现察者模式
let myObj = {
    name: 'webabcd'
}
let myHandler = {
    set: function(target, propertyKey, value, receiver) {
        const result = Reflect.set(target, propertyKey, value, receiver);
        observerList.forEach(observer => observer());
        return result;
    }
}
const observerList = new Set();
const observer = fn => observerList.add(fn);
const observable = obj => new Proxy(obj, myHandler);

// 指定观察者
observer(function () {
    console.log("我是观察者 1,发现了 myObj 的属性发生了变化");
});
observer(function () {
    console.log("我是观察者 2,发现了 myObj 的属性发生了变化");
});

// 指定可被观察的对象,属性发生变化时通知所有观察者
let observableObj = observable(myObj);
observableObj.name = "wanglei";

源码 https://github.com/webabcd/Html5
作者 webabcd

标签:es6,console,进阶,Object,万象更新,Reflect,proxy,target,log
From: https://www.cnblogs.com/webabcd/p/18428834/html5_es6_src_advanced_proxy_reflect

相关文章

  • 万象更新 Html5 - es6 进阶: 编译和压缩
    源码https://github.com/webabcd/Html5作者webabcd万象更新Html5-es6进阶:编译和压缩示例如下:es6\src\index.html<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>es6</title><......
  • 万象更新 Html5 - es6 进阶: ArrayBuffer
    源码https://github.com/webabcd/Html5作者webabcd万象更新Html5-es6进阶:ArrayBuffer示例如下:es6\src\advanced\arrayBuffer.js/***1、ArrayBuffer-内存之中的一段二进制数据,需要通过视图操作数据*2、TypedArray-视图,用于操作ArrayBuffer对象,TypedArr......
  • C++和OpenGL实现3D游戏编程【连载11】——光照效果进阶
    1、本节要实现的内容我们在前面的章节里内容简单的介绍了一下光照,随着后期对纹理内容的增加,我们需要了解更多的光照知识,本节我们回顾一下光照相关内容,并了解一下怎样实现纹理的光照效果。下面这个图就是我们借助于纹理文字产生的半透明光照效果。半透明纹理文字光照演......
  • 万象更新 Html5 - es6 进阶: promise
    源码https://github.com/webabcd/Html5作者webabcd万象更新Html5-es6进阶:promise示例如下:es6\src\advanced\promise.js/***Promise-用于异步编程(非多线程)*有3种状态:pending(进行中),fulfilled(已成功),rejected(已失败)*状态只能从pending变为fulfil......
  • 万象更新 Html5 - es6 进阶: async/await
    源码https://github.com/webabcd/Html5作者webabcd万象更新Html5-es6进阶:async/await示例如下:es6\src\advanced\async_await.js/***async/await-用于异步编程(非多线程)*asyncfunction返回的是Promise对象*await用于等Promise对象或者thenab......
  • 万象更新 Html5 - vue.js: vue 指令(自定义指令)
    源码https://github.com/webabcd/Html5作者webabcd万象更新Html5-vue.js:vue指令(自定义指令)示例如下:vue\directive\vcustom.html<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>vue指令(自定......
  • 万象更新 Html5 - vue.js: vue 组件 1
    源码https://github.com/webabcd/Html5作者webabcd万象更新Html5-vue.js:vue组件1示例如下:vue\component\sample1.html<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>vue组件1</t......
  • 万象更新 Html5 - vue.js: vue 组件 2
    源码https://github.com/webabcd/Html5作者webabcd万象更新Html5-vue.js:vue组件2示例如下:vue\component\sample2.html<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>vue组件2</t......
  • 万象更新 Html5 - vue.js: vue 路由基础
    源码https://github.com/webabcd/Html5作者webabcd万象更新Html5-vue.js:vue路由基础示例如下:vue\router\sample1.html<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>vue路由基础</titl......
  • 万象更新 Html5 - es6 基础: var, let, const
    源码https://github.com/webabcd/Html5作者webabcd万象更新Html5-es6基础:var,let,const示例如下:es6\src\basic\var_let_const.js//let仅在代码块内有效{leta=100;console.log(a);}{leta=100;console.log(a);}//const常量,......