gpt4 book ai didi

javascript - 劫持 .__proto__

转载 作者:行者123 更新时间:2023-12-02 14:26:30 30 4
gpt4 key购买 nike

当一个对象被实例化时,无论是字符串/函数/等等,__proto__属性(property)包括在内。该属性似乎是由 __proto__ 生成的Object.prototype 中的访问器...

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__ 之前执行一些代码在新实例上。

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

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;
}
});

尚无法判断它是否正常工作,但这只是一个尝试向您展示我想要实现的目标的示例。

最佳答案

I'm wondering if it is possible to hijack this __proto__ property to execute a code block when an object is instantiated.

没有。创建对象时不会调用 __proto__ 属性的访问器。仅当您获取或设置 __proto__ 时才会调用它们。您可以通过查看 the spec 来了解创建对象时会发生什么:

ObjectCreate (proto [ , internalSlotsList ])

The abstract operation ObjectCreate with argument proto (an object or null) is used to specify the runtime creation of new ordinary objects. The optional argument internalSlotsList is a List of the names of additional internal slots that must be defined as part of the object. If the list is not provided, a new empty List is used. This abstract operation performs the following steps:

  1. If internalSlotsList was not provided, let internalSlotsList be a new empty List.
  2. Let obj be a newly created object with an internal slot for each name in internalSlotsList.
  3. Set obj's essential internal methods to the default ordinary object definitions specified in 9.1.
  4. Set the [[Prototype]] internal slot of obj to proto.
  5. Set the [[Extensible]] internal slot of obj to true.
  6. Return obj.

回想一下,__proto__不是对象的原型(prototype)引用;这是对象中的 [[Prototype]] 槽,在代码中无法访问。 __proto__ 只是访问该槽中的值的一种(仅限网络)方法。 (一般方法也可以在浏览器外部工作,而 __proto__ 官方不行,是 getPrototypeOfsetPrototypeOf 上的 Object/Reflect 。)另请注意,并非所有对象都有 __proto__ ,因为并非所有对象都继承自 Object.prototype :

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

关于javascript - 劫持 .__proto__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38202033/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com