原型链黑魔法
发布于 3 年前 作者 spitWind 4999 次浏览 来自 分享

// 通过 调用 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();

定义的越多,越难以自洽

回到顶部