是否有可能与全局构造函数的原型进行交互?
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()
方法来获取它。
据我所知,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()
方法来获取它。