ES6 Proxy

本文详细介绍了JavaScript中Proxy对象的使用方法及其各种拦截器的功能,包括has、get、set、apply、construct等,并解释了它们的工作原理及限制。

Proxy格式:

let target = {}, handler = {};  
let proxy = new Proxy(target, handler);  

---
let obj = {};
let proxy = new Proxy(obj, {
    // ...
})

外界每次通过Proxy访问target 对象的属性时,就会经过 handler 对象,因此,我们可以通过重写handler对象中的一些方法来做一些拦截的操作。

监听属性、参数及监听内容

属性值监听器参数监听内容
hastarget, prop监听 in 语句的使用
gettarget, prop, reciver监听目标对象的属性读取
settarget, prop, value, reciver监听目标对象的属性赋值
deletePropertytarget, prop监听 delete 语句对目标对象的删除属性行为
ownKeystarget监听 Object.getOwnPropertyName() 的读取
applytarget, thisArg, arguments监听目标函数(作为目标对象)的调用行为
constructtarget, arguments, newTarget监听目标构造函数作为目标对象利用 new 而生成实例的行为
getPrototypeOftarget监听 Objext.getPrototypeOf() 的读取
setPrototypeOftarget, prototype监听 Objext.setPrototypeOf() 的调用
isExtensibletarget监听 Objext.isExtensible() 的读取
preventExtensionstarget监听 Objext.preventExtensions() 的读取
getOwnPropertyDescriptortarget, prop
definePropertytarget, property, descriptor监听 Object.defineProperty() 的调用

has

handler.has() 方法可以看作是针对 in 操作的钩子

var p = new Proxy(target, {  
  has: function(target, prop) {  
  }  
});  

-targe,目标对象 -prop,需要检查是否存在的属性 -this绑定到handler对象上 -返回一个boolean值

const p = new Proxy({}, {
    has(target, prop){
        console.log(`Checking "${prop}" is in the target or not`);
        return true;
    }
})

console.log('foo' in p);
// Checking "foo" is in the target or not
// true

约束,违背proxy会抛出一个TypeError: -如果目标对象的某一属性本身不可被配置,则该属性不能够被代理隐藏 -如果目标对象为不可扩展对象,则该对象的属性不能够被代理隐藏

get

handler.get() 方法用于拦截对象的读取属性操作。

var p = new Proxy(target, {  
  get: function(target, property, receiver) {  
  }  
});  
const obj = {foo: 1};
const p = new Proxy(obj, {
    get(target, prop){
        console.log(`Program is trying to fetch the property "${prop}".`);
        return target[prop];
    }
})

p.foo;  // Program is trying to fetch the property "foo".
p.something;    // Program is trying to fetch the property "something".

约束条件: -如果要访问的目标属性是不可写以及不可配置的,则返回的值必须与该目标属性的值相同。 -如果要访问的目标属性没有配置访问方法,即get方法是undefined的,则返回值必须为undefined。

set

handler.set() 方法用于拦截设置属性值的操作。

var p = new Proxy(target, {
  set: function(target, property, value, receiver) {
  }
});

-target,目标对象 -property,被设置的属性名 -value,被设置的新值 -receiver,最初被调用的对象。通常是proxy本身,但handler的set方法也有可能在原型链上或以其他方式被间接地调用 因此不一定是proxy本身 -this绑定到handler对象上 -返回一个布尔值,返回true代表此次设置属性成功了,如果返回false且设置属性操作发生在严格模式下,那么会抛出一个TypeError

const obj = {};
const p = new Proxy(obj, {
    set(target, prop, value){
        console.log(`Setting value "${value}" on the key "${prop}" in the target object`);
        target[prop] = value;
        return true;
    }
})

p.foo = 1;
// Setting value "1" on the key "foo" in the target object

约束: -若目标属性是不可写及不可配置的,则不能改变它的值 -如果目标属性没有配置存储方法,即set方法是undefined的,则不能设置它的值 -在严格模式下,若set方法返回false,则会抛出一个 TypeError 异常

apply

handler.apply() 方法用于拦截函数的调用

var p = new Proxy(target, {
  apply: function(target, thisArg, argumentsList) {
  }
});

-target,目标对象 函数 -thisArg,被调用时的上下文对象 -argumentsList,被调用时的参数列表 -this绑定到handler对象 -可以返回任何值

const sum = function(...args){
    return args
            .map(Number)
            .filter(Boolean)
            .reduce((a, b) => a + b);

}

const p = new Proxy(sum, {
    apply(target, thisArg, args){
        console.log(`Function is being called with arguments [${args.join()}] and context ${thisArg}`);
        return target.call(thisArg, ...args);
    }
})

console.log(p(1, 2, 3));
// Function is being called with arguments [1,2,3] and context undefined
// 6

construct

handler.construct()用于来接new操作

var p = new Proxy(target, {  
  construct: function(target, argumentsList, newTarget) {  
  }  
});  

-target,目标对象 -argumensList,构造器参数列表 -newTarget,最初调用的构造函数 -this绑定到handler -返回一个对象

class Foo{};

const p = new Proxy(Foo, {
    construct(target, args, newTarget){
        return {arguments: args}    // 这里返回的结果会是 new 所得到的实例}
})

const obj = new p(1, 2, 3);
console.log(obj.arguments);  // [1, 2, 3]

约束: 返回值必须是一个对象

转载于:https://my.oschina.net/u/3886184/blog/1922359

内容概要:本文介绍了一个基于MATLAB实现的多目标粒子群优化算法(MOPSO)在无人机三维路径规划中的应用。该代码实现了完整的路径规划流程,包括模拟数据生成、障碍物随机生成、MOPSO优化求解、帕累托前沿分析、最优路径选择、代理模型训练以及丰富的可视化功能。系统支持用户通过GUI界面设置参数,如粒子数量、迭代次数、路径节点数等,并能一键运行完成路径规划与评估。代码采用模块化设计,包含详细的注释,同时提供了简洁版本,便于理解和二次开发。此外,系统还引入了代理模型(surrogate model)进行性能预测,并通过多种图表对结果进行全面评估。 适合人群:具备一定MATLAB编程基础的科研人员、自动化/控制/航空航天等相关专业的研究生或高年级本科生,以及从事无人机路径规划、智能优化算法研究的工程技术人员。 使用场景及目标:①用于教学演示多目标优化算法(如MOPSO)的基本原理与实现方法;②为无人机三维路径规划提供可复现的仿真平台;③支持对不同参数配置下的路径长度、飞行时间、能耗与安全风险之间的权衡进行分析;④可用于进一步扩展研究,如融合动态环境、多无人机协同等场景。 其他说明:该资源包含两份代码(详细注释版与简洁版),运行结果可通过图形界面直观展示,包括Pareto前沿、收敛曲线、风险热图、路径雷达图等,有助于深入理解优化过程与结果特性。建议使用者结合实际需求调整参数,并利用提供的模型导出功能将最优路径应用于真实系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值