是否有可能与全局构造函数的原型进行交互?

Is there any possibility to interact with prototype of global constructor function?

据我所知,JS 对全局函数原型的意外重写有某种保护。

比如这里不是全局构造函数。一切正常。

function func() { };

function Constructor() {
    this.name = 'Luisa';
    this.surname = 'Li';
    this.age = 48;
};

Constructor.prototype = func;

let obj = new Constructor;
let obj2 = new Constructor;
console.log(obj.__proto__ == func); //true
console.log(obj.__proto__ == func); //true

但是我在这里尝试通过全局构造函数使用原型 Object。没有任何效果。

function func2() { };
Object.prototype = func2;

let a = {};
console.log(a.__proto__ == func2); //false

那么,在 JS 中是否有某种防止重写全局原型的保护?因为在某些情况下 JS 允许我们直接使用全局构造函数(例如添加全局方法)。

如果记录 Object.prototype 属性

的 属性 描述符对象

console.log(Object.getOwnPropertyDescriptor(Object, 'prototype'));

你会注意到,它的:

  • 不可写
  • 不可配置
  • 不可枚举

由于 Object.prototype 是不可写的,这意味着您不能覆盖 Object.prototype 但您可以向 [=11] 指向的对象添加方法(不推荐) =] 属性.

在严格模式下,分配给不可写的 属性 会引发错误,但在非严格模式下,它会静静地失败。


注意:你应该使用Object.setPrototypeOf()方法来设置一个对象的原型,并使用Object.getPrototypeOf()方法来获取它。