【发布时间】:2021-09-29 13:31:16
【问题描述】:
据我所知,对象是由引用分配的(它们不会被复制)。因此,如果一个对象的变化是通过一个链接发生的,那么它们会通过另一个链接发生。
let a = {
writer: 'J.K. Rowling',
singer: 'Beyonce',
politician: 'A. Merkel'
};
let b = a;
delete a.politician;
console.log(b); //there's no politicaian as well
那么……为什么这里的工作方式不同? prototype 是一个对象,所以更改应该无处不在(通过两个链接)。
let userInfo = {
name: 'Kira',
surname: 'Li',
age: 25,
country: 'USA',
city: 'LA'
};
let food = {
fruit: 'apple',
vegetable: 'cabbage',
pastry: 'bun',
drink: 'water'
};
function Constructor() {};
Constructor.prototype = userInfo;
let obj = new Constructor;
Constructor.prototype = food; //reassignment
console.log(Object.getPrototypeOf(obj)); //userInfo
例如,这里发生了变化。为什么?
let userInfo = {
name: 'Kira',
surname: 'Li',
age: 25,
country: 'USA',
city: 'LA'
};
let food = {
fruit: 'apple',
vegetable: 'cabbage',
pastry: 'bun',
drink: 'water'
};
function Constructor() {};
Constructor.prototype = userInfo;
let obj = new Constructor;
Constructor.prototype.name = 'Klara'; //reassignment
console.log(Object.getPrototypeOf(obj));
为什么会这样?为什么在某些情况下会发生变化,而在其他情况下不会发生变化?
【问题讨论】:
-
Constructor.prototype = food; //reassignment重新分配不会将其传播到使用该原型的任何东西。它不能。Constructor.prototype.name = 'Klara';将修改原型和任何使用它的东西。重新分配通常不会更改所有指向原始指针的指针。a = {foo: 1}; b = a; b = {bar: 2}不会改变a。
标签: javascript object prototype