首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >劫持.__proto__

劫持.__proto__
EN

Stack Overflow用户
提问于 2016-07-05 11:14:40
回答 1查看 1.1K关注 0票数 1

当一个对象被实例化时,不管它是字符串/函数/etc,都会包含一个__proto__属性。这个属性似乎是由__proto__访问器在Object.prototype中生成的.

代码语言:javascript
复制
Object.prototype == {
    __defineGetter__    : __defineGetter__()
    __defineSetter__    : __defineSetter__()
    __lookupGetter__    : __lookupGetter__()
    __lookupSetter__    : __lookupSetter__()
    constructor         : Object()
    hasOwnProperty      : hasOwnProperty()
    isPrototypeOf       : isPrototypeOf()
    propertyIsEnumerable: propertyIsEnumerable()
    toLocaleString      : toLocaleString()
    toString            : toString()
    valueOf             : valueOf()
    get __proto__       : __proto__()               //  getter
    set __proto__       : __proto__()               //  setter
};

我想知道在实例化对象时是否可以劫持这个__proto__属性来执行代码块。其思想是将__proto__属性替换为一个自定义属性,该属性在调用原始访问器以在新实例上创建__proto__之前执行一些代码。

如果这有道理的话!如果不是,这就是我要做的事:

代码语言:javascript
复制
pro = Object.prototype;
tmp = {};
Object.defineProperty(tmp, '__proto__',
    Object.getOwnPropertyDescriptor(pro, '__proto__')
);
delete pro.__proto__;
Object.defineProperty(pro, '__proto__',{
    get:function(){
        console.warn('intercepted Get __proto__');
        return tmp.__proto__;
    },
    set(p){
        console.warn('intercepted Set __proto__');
        tmp.__proto__ = p;
    }
});

还不知道它是否正常工作,但这只是一个例子,试图向你展示我正在努力实现的目标。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-05 11:17:54

我想知道在实例化对象时是否可以劫持这个__proto__属性来执行代码块。

不是的。创建对象时不调用__proto__属性的访问器。只有当您获得或设置__proto__时,才会调用它们。通过查看规格,您可以看到创建对象时会发生什么

(proto ObjectCreate [, ObjectCreate] 带有参数proto (对象或null)的抽象操作ObjectCreate用于指定新普通对象的运行时创建。可选参数internalSlotsList是必须定义为对象一部分的其他内部插槽的名称列表。如果没有提供列表,则使用新的空列表。此抽象操作执行以下步骤:

  1. 如果没有提供internalSlotsList,则让internalSlotsList成为一个新的空列表。
  2. 让obj成为一个新创建的对象,为internalSlotsList中的每个名称设置一个内部插槽。
  3. 将obj的基本内部方法设置为9.1中指定的默认普通对象定义。
  4. 将obj的[原型]内部槽设置为proto。
  5. 将obj的[可扩展]内部槽设置为true。
  6. 返回讣告。

回想一下,__proto__不是对象的原型引用;它是对象中的[[Prototype]]槽,在代码中是不可访问的。__proto__只是访问该时隙中值的一种(仅限于web的)手段。(一般的方法是getPrototypeOf / setPrototypeOfObjectReflect上运行,它也可以在浏览器之外工作,而setPrototypeOf却没有。)还请注意,并非所有对象都具有__proto__,因为并非所有对象都继承自Object.prototype

代码语言:javascript
复制
var o1 = {};
console.log("__proto__" in o1); // true
var o2 = Object.create(null);   // No prototype
console.log("__proto__" in o2); // false
var o3 = Object.create(o2);     // Has a prototype, but still no link to Object.prototype
console.log("__proto__" in o3); // false

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38202033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档