首页 > 解决方案 > 如果使用 Object.create(null) 创建对象,为什么 object.__proto__ 可以更改为原始对象;

问题描述

当我们使用__proto__属性创建普通对象时。属性只能是 object 或 null,如果我们想将proto更改为原始类型,这仍然是 Object.prototype。

const obj1 = {
  __proto__: "test"
};

console.log(obj1.__proto__)// Still Object.prototype not change to "test"

但是如果我们通过Object.create(null)创建对象,对象的proto属性可以改变原始类型。

const obj2 = Object.create(null);

obj2.__proto__ = "test";
console.log(obj2.__proto__) // "test"

所以我知道 __proto__ 不是对象的属性,而是 Object.prototype 的访问器属性:

我的问题是我们如何手动创建像proto这样的访问器属性?

我想在Object.prototype中创建一个 getter 和 setter,并且这个 getter 和 setter 不能像proto内部属性一样被覆盖。

例如,如果我像这样声明 getter 和 setter

Object.defineProperty(Object.prototype, "lastName", {
    get() {
        return "Sofiyev"
    },
    set(v) {

    },
});

lastName 属性不能像这样被覆盖。

  const murad = {};
  murad.lastName = 123
  console.log(murad.lastName) //Sofiyev

但像这样可以覆盖。

const murad = {
    lastName: "123"
};

console.log(murad.lastName) // 123

这对我来说很有趣,为什么 __proto__ 不像我的上一个示例那样可覆盖

标签: javascriptprototype

解决方案


推荐阅读