【发布时间】:2016-07-05 11:14:40
【问题描述】:
当一个对象被实例化时,无论是字符串/函数/等等,都会包含一个__proto__ 属性。该属性似乎是由Object.prototype 中的__proto__ 访问器生成的...
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;
}
});
目前还不能确定它是否正常工作,但这只是一个尝试向您展示我想要实现的目标的示例。
【问题讨论】:
-
“包含
__proto__属性” - 不,它是继承的。您不会说每个对象都包含hasOwnProperty属性,对吗? -
不,你不能再劫持他们,and that's a good thing。
标签: javascript inheritance prototype proto