原型链黑魔法
// 通过 调用 Object.prototype, "set __proto__" 可以增加原型链,
// 可以通过调用 Object.defineProperty 设置扩展的key:"base"
// 并且该原型链会增加到__proto__, 可以被Object.getPrototypeOf 获取
// 然后 __proto__|base 设置为空时, 你扩展的属性[base]也会被设置为空 []
// 另外获取到的 __proto__ 是undefined,getPrototypeOf 是null
// // 原型链不能被delete,但是可以被 设置为空,
var d = { __proto__: null }
// Object.setPrototypeOf(d, Array);
var proto = Object.getOwnPropertyDescriptor(Object.prototype, "__proto__")
console.log(proto);
proto.configurable = false
Object.defineProperty(d, "base", proto);
// Reflect.defineProperty(d, "base", proto);
console.log("after defineProperty|\n __proto__", d.__proto__);
d.base = Object.prototype
console.log("set key [base]\n getPrototypeOf", Object.getPrototypeOf(d))
console.log("__proto__", d.__proto__);
function test1() {
// delete d.__proto__;
console.log("del __proto__ fail", d.__proto__);
d.__proto__ = null;
// 设置为空
console.log("delete d.__proto__")
console.log("__proto__", d.__proto__);
// console.log("base:", d.base)
console.log("getPrototypeOf [c]", Object.getPrototypeOf(d))
}
function test2() {
delete d.base;
// console.log("del base fail", d.base);
d.base = null;
// 设置为空
console.log("delete d.base")
console.log("__proto__", d.__proto__);
// console.log("base:", d.base)
console.log("getPrototypeOf [c]", Object.getPrototypeOf(d))
}
test1();
// test2();
定义的越多,越难以自洽