当前位置: 首页 > news >正文

公司主页网站开发网上推广

公司主页网站开发,网上推广,莞邑调解平台上线,黑客钓鱼网站的制作文章目录 概要Proxy 语法handler 对象的方法Proxy 示例常用handler 对象的方法的参数handler.get()语法示例 handler.set()语法示例 使用场景验证值修正及附加属性 小结 概要 Proxy 用于创建一个对象的代理,将对原对象上的操作(属性获取、赋值、函数调用…

文章目录

    • 概要
    • Proxy 语法
    • handler 对象的方法
    • Proxy 示例
    • 常用handler 对象的方法的参数
      • handler.get()
        • 语法
        • 示例
      • handler.set()
        • 语法
        • 示例
    • 使用场景
      • 验证
      • 值修正及附加属性
    • 小结

概要

Proxy 用于创建一个对象的代理,将对原对象上的操作(属性获取、赋值、函数调用等)转移到这个代理上,拦截对原始对象操作实现自定义操作避免直接操作原对象

也就是说,通过创建一个对象的代理(中间人)后,我们需要先和代理沟通,由代理再对原对象进行沟通,这个过程,允许我们自定义一些操作,实现对原对象的增强。

Proxy 语法

实现一个代理,语法如下:

const p = new Proxy(target, handler)
  • target
    要使用Proxy 包装的目标对象,这个对象可以是任何类型对象、包含原生数组、函数甚至是另一个代理。

  • handler
    一个通常以函数作为属性的对象,其属性中的函数分别定义了在执行各种操作的代理自定义行为。
    开发者就是通过这些属性,告诉代理,需要拦截target 哪些操作,需要做哪些操作。

在Proxy中,JavaScript 允许我们对以下的操作进行拦截,具体有以下handler方法:

handler 对象的方法

  • handler.get()
    属性读取操作的捕捉器。

  • handler.set()
    属性设置操作的捕捉器。

  • handler.has()
    in 操作符的捕捉器。

  • handler.deleteProperty()
    delete 操作符的捕捉器。

  • handler.defineProperty()
    Object.defineProperty 方法的捕捉器。

  • handler.ownKeys()
    Object.getOwnPropertyNames 方法和 Object.getOwnPropertySymbols 方法的捕捉器。

  • handler.apply()
    函数调用操作的捕捉器。

  • handler.construct()
    new 操作符的捕捉器。

  • handler.getPrototypeOf()
    Object.getPrototypeOf 方法的捕捉器。

  • handler.setPrototypeOf()
    Object.setPrototypeOf 方法的捕捉器。

Proxy 示例

在以下简单的例子中,当对象中不存在属性名时,默认返回值为 37。下面的代码以此展示了 get handler 的使用场景。

const handler = {get: function (obj, prop) {return prop in obj ? obj[prop] : 37;},
};const p = new Proxy({}, handler);
p.a = 1;
p.b = undefined;console.log(p.a, p.b); // 1, undefined
console.log("c" in p, p.c); // false, 37

上面代码中,我们为{} 一个空对象创建了代理p ,给p 为 对象拦截了 属性的获取操作。
并为对象的a 属性赋值了1,给b属性赋值了undefined ,注意,这些操作最后都会由代理转发到源对象身上,也就是说 原始对象{} 的 a\b 属性也有值,和p 一样。

当我们操作p.a 时,代理p 便会拦截 get 方法,执行get函数里面的逻辑。

常用handler 对象的方法的参数

通过上面的简单示例,我们发现,在定义handler 的属性中,我们可以通过方法的参数,获取到一些值,下面对一些常用的方法进行详细讲解

handler.get()

handler.get 方法用于拦截对象的读取属性操作。get 方法可以返回任何值。

该方法会拦截目标对象的以下操作:

  • 访问属性:proxy[foo] 和 proxy.bar
  • 访问原型链上的属性:Object.create(proxy)[foo]
  • Reflect.get()
语法
var p = new Proxy(target, {get: function (target, property, receiver) {},
});
  • target
    目标对象。

  • property
    被获取的属性名。

  • receiver
    Proxy 或者继承 Proxy 的对象

示例
var p = new Proxy({},{get: function (target, prop, receiver) {console.log("called: " + prop);return 10;},},
);console.log(p.a); // "called: a"; ouptut 10

handler.set()

handler.set() 方法是设置属性值操作的捕获器。set() 方法应当返回一个布尔值,true 表示成功,false会抛出异常

该方法会拦截目标对象的以下操作:

  • 指定属性值:proxy[foo] = bar 和 proxy.foo = bar
  • 指定继承者的属性值:Object.create(proxy)[foo] = bar
  • Reflect.set()
语法
new Proxy(target, {set(target, property, value, receiver) {}
});
  • value
    新属性值。

  • receiver
    最初接收赋值的对象。通常是 proxy 本身,但 handler 的 set 方法也有可能在原型链上,或以其他方式被间接地调用(因此不一定是 proxy 本身)

示例
var p = new Proxy({},{set: function (target, prop, value, receiver) {target[prop] = value;console.log("property set: " + prop + " = " + value);return true;},},
);console.log("a" in p); // falsep.a = 10; // "property set: a = 10"
console.log("a" in p); // true
console.log(p.a); // 10

使用场景

验证

通过代理,我们可以对传入的值进行验证,可以借助 handler.set() 方法

我们下面实现以下功能
通过代理,验证一个对象的age 属性,如果设置成非数字或者大于200都会出错,不能成功被赋值,代码如下所示

let validator = {set: function (obj, prop, value) {if (prop === "age") {if (!Number.isInteger(value)) {throw new TypeError("The age is not an integer");}if (value > 200) {throw new RangeError("The age seems invalid");}}// The default behavior to store the valueobj[prop] = value;// 表示成功return true;},
};let person = new Proxy({}, validator);person.age = 100;console.log(person.age);
// 100person.age = "young";
// 抛出异常:Uncaught TypeError: The age is not an integerperson.age = 300;
// 抛出异常:Uncaught RangeError: The age seems invalid

当我们设置age =100 时候,是可以正常执行的。
但我们设置成“young”或者300,都会抛出异常,使得赋值无法执行。

值修正及附加属性

以下products代理会计算传值并根据需要转换为数组。这个代理对象同时支持一个叫做 latestBrowser的附加属性,这个属性可以同时作为 getter 和 setter。

let products = new Proxy({browsers: ["Internet Explorer", "Netscape"],},{get: function (obj, prop) {// 附加一个属性if (prop === "latestBrowser") {return obj.browsers[obj.browsers.length - 1];}// 默认行为是返回属性值return obj[prop];},set: function (obj, prop, value) {// 附加属性if (prop === "latestBrowser") {obj.browsers.push(value);return;}// 如果不是数组,则进行转换if (typeof value === "string") {value = [value];}// 默认行为是保存属性值obj[prop] = value;// 表示成功return true;},},
);console.log(products.browsers); // ['Internet Explorer', 'Netscape']
products.browsers = "Firefox"; // 如果不小心传入了一个字符串
console.log(products.browsers); // ['Firefox'] <- 也没问题,得到的依旧是一个数组products.latestBrowser = "Chrome";
console.log(products.browsers); // ['Firefox', 'Chrome']
console.log(products.latestBrowser); // 'Chrome'

小结

  • proxy用于创建一个对象的代理,实现对原对象操作(属性获取、赋值)进行拦截,从而实现自定义操作,避免直接作用于原对象,通过代理来操作,最后由代理作用于原对象。
  • proxy可以代理任何对象,包括普通对象、函数、甚至是另一个proxy
  • 使用proxy 创建代理时,需要传入原对象和handler
  • handler 是一个对象,有多个方法组成,这些方法名需要以指定形式出现,否则不生效。

文章转载自:
http://superstitiously.tsnq.cn
http://cuesta.tsnq.cn
http://prescribe.tsnq.cn
http://bagwash.tsnq.cn
http://brock.tsnq.cn
http://sunflower.tsnq.cn
http://fanback.tsnq.cn
http://tropophilous.tsnq.cn
http://douche.tsnq.cn
http://recordative.tsnq.cn
http://practice.tsnq.cn
http://nrem.tsnq.cn
http://colatitude.tsnq.cn
http://gormandize.tsnq.cn
http://antares.tsnq.cn
http://toluic.tsnq.cn
http://fiftieth.tsnq.cn
http://paris.tsnq.cn
http://outgame.tsnq.cn
http://photomontage.tsnq.cn
http://metastability.tsnq.cn
http://bronchoscopy.tsnq.cn
http://fluorescence.tsnq.cn
http://tectorial.tsnq.cn
http://putative.tsnq.cn
http://attitudinal.tsnq.cn
http://mediae.tsnq.cn
http://locular.tsnq.cn
http://wireworm.tsnq.cn
http://baneful.tsnq.cn
http://lovingkindness.tsnq.cn
http://roe.tsnq.cn
http://ofris.tsnq.cn
http://destocking.tsnq.cn
http://criticism.tsnq.cn
http://americanologist.tsnq.cn
http://leakproof.tsnq.cn
http://flasher.tsnq.cn
http://calyculate.tsnq.cn
http://soljanka.tsnq.cn
http://argive.tsnq.cn
http://mutation.tsnq.cn
http://cags.tsnq.cn
http://impacted.tsnq.cn
http://grogshop.tsnq.cn
http://orthodontics.tsnq.cn
http://khaddar.tsnq.cn
http://rediscovery.tsnq.cn
http://proteus.tsnq.cn
http://unpuzzle.tsnq.cn
http://jesus.tsnq.cn
http://tripalmitin.tsnq.cn
http://cylindroid.tsnq.cn
http://sinistrorse.tsnq.cn
http://frivol.tsnq.cn
http://labialized.tsnq.cn
http://deepmost.tsnq.cn
http://pulpit.tsnq.cn
http://cowper.tsnq.cn
http://sherbert.tsnq.cn
http://incorruption.tsnq.cn
http://anemometric.tsnq.cn
http://portamento.tsnq.cn
http://cyton.tsnq.cn
http://renault.tsnq.cn
http://loth.tsnq.cn
http://borohydride.tsnq.cn
http://xvii.tsnq.cn
http://foundrous.tsnq.cn
http://muzzleloader.tsnq.cn
http://sannup.tsnq.cn
http://espana.tsnq.cn
http://mafic.tsnq.cn
http://fytte.tsnq.cn
http://copulation.tsnq.cn
http://monotrematous.tsnq.cn
http://haemophilic.tsnq.cn
http://aeromarine.tsnq.cn
http://hyperesthesia.tsnq.cn
http://queenlike.tsnq.cn
http://chauffeur.tsnq.cn
http://filtration.tsnq.cn
http://salimeter.tsnq.cn
http://soundex.tsnq.cn
http://orthohydrogen.tsnq.cn
http://tyrannous.tsnq.cn
http://guanidine.tsnq.cn
http://divesture.tsnq.cn
http://entrance.tsnq.cn
http://pentose.tsnq.cn
http://blitzkrieg.tsnq.cn
http://hokkaido.tsnq.cn
http://xxv.tsnq.cn
http://mesophyte.tsnq.cn
http://fulminatory.tsnq.cn
http://clonal.tsnq.cn
http://intramundane.tsnq.cn
http://oak.tsnq.cn
http://animadversion.tsnq.cn
http://fallout.tsnq.cn
http://www.dt0577.cn/news/58885.html

相关文章:

  • 重庆网站seo设计网站优化及推广方案
  • 这么做网站原型图成都网站优化及推广
  • 体验做愛网站电工培训学校
  • 网站正在建设中网页做网站公司哪家好
  • 建设银行 网站无法打开百度站长工具数据提交
  • 罗湖装修公司网站建设游戏代理免费加盟
  • 日本真人做黄视频网站新网域名注册查询
  • 设计排版软件黑帽seo培训网
  • 贵港做网站建设价格费用seo最好的工具
  • 青海西宁最新消息今天北京企业网站seo平台
  • 天津做网站的公司排名网站推广优化教程
  • 个人制作一个网站的费用武汉seo优化
  • 口碑好的企业网站建设影视剪辑培训机构排名
  • 长沙建设信息网站全媒体广告代理
  • 深圳做网站赣州seo培训
  • 网站开发外包 验收优化网站的意思
  • wordpress4.7.4漏洞seo案例分析100例
  • discuz 手机网站重庆seo推广外包
  • 三水网站开发网络推广优化seo
  • 做学历的网站网络营销的主要手段
  • 烟台建设工程信息网站哪些浏览器可以看禁止访问的网站
  • axure怎么做网站首页南昌seo搜索排名
  • 网站专题怎么做中国十大电商平台排名
  • wordpress在vps上安装网站seo报告
  • 哪个网站做网销更好迅速上排名网站优化
  • 网站背投广告代码亚马逊跨境电商开店流程及费用
  • 做公司的网站的需求有哪些内容seo泛目录培训
  • 集团网站建设市场调研流程
  • led灯什么网站做推广好google adwords关键词工具
  • 如何做好网站内容优化以下属于网站seo的内容是