【发布时间】:2020-05-09 17:57:18
【问题描述】:
让我们考虑下面的代码,
let f = function () {
this.a = 1;
this.b = 2;
}
let o = new f();
f.prototype.c = 3;
console.log(Object.getPrototypeOf(o));
打印
[对象对象] { c: 3 }
但如果我使用 setPrototypeOf 而不是 f.prototype.c,则对象为空。
let f = function () {
this.a = 1;
this.b = 2;
}
let o = new f();
Object.setPrototypeOf(f, {c: 3});
console.log(Object.getPrototypeOf(o));
打印
[对象对象] { ... }
但是如果我使用
let f = function () {
this.a = 1;
this.b = 2;
}
let o = new f();
Object.setPrototypeOf(f, {c: 3});
console.log(Object.getPrototypeOf(f));
打印
[对象对象] { c: 3 }
简而言之,问题是,当使用 Object.setPrototypeOf(o) 时,对象打印为空, 并且当使用 Object.setPrototypeOf(f) 时,对象会打印添加的属性。 在使用 f.prototype.c = 3 设置原型时,两个对象都可以访问它 原型和函数原型。
【问题讨论】:
-
如果您有
obj = {},然后是obj.foo = 1或obj = {bar: 2},则差别不大。您要么修改现有对象,要么替换它。o保持对原始的引用。 -
那么就这两种添加原型的方式(setPrototypeOf 和 .prototype)而言,有什么不同呢?
-
我在答案中对此进行了扩展,但想象一下上面的代码有
obj2 = obj。如果你这样做obj.foo = 1,你正在“改变”obj2,因为它实际上只是对同一对象的新引用。但是obj = {bar: 2}将保持obj2不变,因为现在obj和obj2指向不同的对象。 -
哇,我不知道 obj = {} 语法不会修改另一个对象,我知道 Object.assign() 和用于复制的扩展运算符,但从未读过这个保持对象不可变的方式,谢谢,现在让我再看看代码。我仍在尝试将其与这两种设置原型的方式联系起来。
-
我遇到的另一件事是在执行 setPrototypeOf() 时,它替换了完整的原型属性,其中 .prototype 可以添加到它上面,在这里我可以将您关于引用和复制的解释联系起来
标签: javascript object prototype