Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么使用object.create(null)创建对象时,可以将对象.\uuuuu proto\uuuuu更改为原语;_Javascript_Prototype - Fatal编程技术网

Javascript 为什么使用object.create(null)创建对象时,可以将对象.\uuuuu proto\uuuuu更改为原语;

Javascript 为什么使用object.create(null)创建对象时,可以将对象.\uuuuu proto\uuuuu更改为原语;,javascript,prototype,Javascript,Prototype,当我们用\uuuu proto\uuuu属性创建普通对象时。属性只能是object或null,如果我们想将proto更改为primitive类型,这仍然是object.prototype const obj1 = { __proto__: "test" }; console.log(obj1.__proto__)// Still Object.prototype not change to "test" 但是,如果我们通过对象创建对象,create(null)对象的proto属性可以更改

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

const obj1 = {
  __proto__: "test"
};

console.log(obj1.__proto__)// Still Object.prototype not change to "test"
但是,如果我们通过对象创建对象,create(null)对象的proto属性可以更改原语类型

const obj2 = Object.create(null);

obj2.__proto__ = "test";
console.log(obj2.__proto__) // "test"
所以我知道\uuuu proto\uuuuu不是对象的属性,而是对象的访问器属性。prototype:

我的问题是如何手动创建访问器属性,如proto

我想在对象内部创建一个getter和setter。prototype和这个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
但是可以像这样覆盖

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

console.log(murad.lastName) // 123

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

您试图重新创建的是
\uu proto\uuuu
的哪个方面?在我的第一个示例中,为什么proto不能像property一样工作,它像Object.prototype的accessor属性一样工作。我在类对象属性中声明它。我们可以创建这样的访问器属性吗?编辑有了很大的改进。不幸的是,答案是你不能。除了由
object.create(null)
创建的对象之外,每个对象都是从
object.prototype
派生的。因此,您所做的任何修改都不会应用于此。@MuradSofiyev这是因为在与web兼容的浏览器环境中,对象文字的一个特定功能。这不是你自己可以创建的。@MuradSofiyev继承的
。\uuuu proto\uuuu
确实与创建对象后试图更改该属性有关
o={{uuuuu-proto\uuuuux}
o.{uuuu-proto\uuuuux
是两种不同的事物,它们有自己的行为模式。