Угон.__ Прото

Когда объект создается, будь то строка / функция / и т. Д., __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 представляет собой список имен дополнительных внутренних слотов, которые должны быть определены как часть объекта. Если список не предоставлен, используется новый пустой список. Эта абстрактная операция выполняет следующие шаги:

  1. Если internalSlotsList не был предоставлен, пусть internalSlotsList будет новым пустым списком.
  2. Пусть obj будет вновь созданным объектом с внутренним слотом для каждого имени в internalSlotsList.
  3. Установите для основных внутренних методов obj стандартные определения объектов по умолчанию, указанные в 9.1.
  4. Установите внутренний слот [[Prototype]] для obj в proto.
  5. Установите для внутреннего [[Extensible]] внутреннего слота obj значение true.
  6. Вернуть объект

Напомним, что __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

Другие вопросы по тегам