Javascript 为什么使用object.create(null)创建对象时,可以将对象.\uuuuu proto\uuuuu更改为原语;
当我们用\uuuu proto\uuuu属性创建普通对象时。属性只能是object或null,如果我们想将proto更改为primitive类型,这仍然是object.prototypeJavascript 为什么使用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属性可以更改
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
是两种不同的事物,它们有自己的行为模式。