广告
文章导航

Proxy handler.getPrototypeOf() 方法

2019-4-14 23:23| 作者: admin| 查看: 88| 评论: 0|来自: 蚂蚁部落

关于Proxy更多内容可以参阅Proxy和Reflect一章节。

此方法可以拦截获取原型对象操作,返回值是一个对象或者null。

语法结构:

[JavaScript] 纯文本查看 复制代码
var p = new Proxy(obj, {
  getPrototypeOf(target) {
    //code
  }
});

参数解析:

(1).target:可选,要被代理的目标对象。能够被拦截的操作如下:

(1).Object.getPrototypeOf()。

(2).Reflect.getPrototypeOf()。

(3).__proto__。

(4).Object.prototype.isPrototypeOf()。

(5).instanceof。

特别说明:

(1).返回值必须是一个对象或者null,否则会报错。

(2).如果target对象不可扩展,那么此方法的返回值必须与Object.getPrototypeOf()返回值相同,否则报错。

代码实例:

[JavaScript] 纯文本查看 复制代码运行代码
var obj = {};
var proto = {};
var handler = {
  getPrototypeOf(target) {
    console.log(target === obj);
    console.log(this === handler);
    return proto;
  }
};
var p = new Proxy(obj, handler);
console.log(Object.getPrototypeOf(p) === proto);

上面的代码拦截Object.getPrototypeOf()操作。

[JavaScript] 纯文本查看 复制代码运行代码
var obj = {};
var p = new Proxy(obj, {
  getPrototypeOf(target) {
    return Array.prototype;
  }
});
console.log(p instanceof Object);

instanceof操作也会被handler.getPrototypeOf()方法拦截。

[JavaScript] 纯文本查看 复制代码运行代码
let antzone = {
  webName: "蚂蚁部落",
  url: "www.softwhy.com",
}
let p = new Proxy(antzone, {
  getPrototypeOf(target) {
    return "蚂蚁部落";
  }
});
Object.getPrototypeOf(p);

handler.getPrototypeOf()方法的返回值必须是一个对象或者null,否则会报错。

[JavaScript] 纯文本查看 复制代码运行代码
let antzone = {
  webName: "蚂蚁部落",
  url: "www.softwhy.com",
}
Object.preventExtensions(antzone);
let p = new Proxy(antzone, {
  getPrototypeOf(target) {
    return {};
  }
});
Object.getPrototypeOf(p);

antzone不可扩展,所以handler.getPrototypeOf返回值必须和Object.getPrototypeOf返回值相同。

代码修改如下:

[JavaScript] 纯文本查看 复制代码运行代码
let antzone = {
  webName: "蚂蚁部落",
  url: "www.softwhy.com",
}
Object.setPrototypeOf(antzone, {
  address: "青岛市南区"
});
 
Object.preventExtensions(antzone);
let p = new Proxy(antzone, {
  getPrototypeOf(target) {
    return Object.getPrototypeOf(target);
  }
});
console.log(Object.getPrototypeOf(p));

鲜花

握手

雷人

路过

鸡蛋

最新评论

返回顶部