Угон.__ Прото
Когда объект создается, будь то строка / функция / и т. Д., __proto__
собственность включена. Это свойство, кажется, генерируется __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;
}
});
Пока не могу сказать, работает ли он правильно, но это всего лишь пример, чтобы попытаться показать вам, чего я пытаюсь достичь.
1 ответ
Мне интересно, если это возможно, угнать это
__proto__
свойство для выполнения блока кода, когда объект создается.
№ __proto__
методы доступа свойства не вызываются при создании объекта. Они вызываются только когда вы получаете или устанавливаете __proto__
, Вы можете увидеть, что происходит при создании объекта, посмотрев на спецификацию:
ObjectCreate (proto [, internalSlotsList ])
Абстрактная операция ObjectCreate с аргументом proto (объект или ноль) используется для указания времени создания новых обычных объектов. Необязательный аргумент internalSlotsList представляет собой список имен дополнительных внутренних слотов, которые должны быть определены как часть объекта. Если список не предоставлен, используется новый пустой список. Эта абстрактная операция выполняет следующие шаги:
- Если internalSlotsList не был предоставлен, пусть internalSlotsList будет новым пустым списком.
- Пусть obj будет вновь созданным объектом с внутренним слотом для каждого имени в internalSlotsList.
- Установите для основных внутренних методов obj стандартные определения объектов по умолчанию, указанные в 9.1.
- Установите внутренний слот [[Prototype]] для obj в proto.
- Установите для внутреннего [[Extensible]] внутреннего слота obj значение true.
- Вернуть объект
Напомним, что __proto__
не является ссылкой на прототип объекта; это [[Prototype]]
слот в объекте, который не доступен в коде. __proto__
это просто (только для веб) средство доступа к значению в этом слоте. (Общий способ, который также работает вне браузеров, тогда как __proto__
официально не getPrototypeOf
/ setPrototypeOf
на 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