Javascript将新对象分配给函数原型,将删除实例和函数原型之间的链接

Javascript将新对象分配给函数原型,将删除实例和函数原型之间的链接,javascript,prototype,Javascript,Prototype,上面的代码按预期工作,因为当我使用关键字new调用“User”函数时,它将返回一个只有name属性的对象,并且该对象将链接到User.prototype 但我没有得到的是,当我给原型分配了一个对象时,就再也没有链接了 function User() { this.name = "name"; } User.prototype.age = 10; const user1 = new User(); // user1 -> { name: "name&qu

上面的代码按预期工作,因为当我使用关键字
new
调用“User”函数时,它将返回一个只有
name
属性的对象,并且该对象将链接到
User.prototype

但我没有得到的是,当我给原型分配了一个对象时,就再也没有链接了

function User() {
  this.name = "name";
}

User.prototype.age = 10;

const user1 = new User(); // user1 -> { name: "name" }

console.log(user1.age) // prints 10
console.log(user1.__proto__ === user.prototype) // prints true

// if i change the age value on prototype, then user1.age will return the new value
User.prototype.age = 20;
console.log(user1.age) // prints 20
注意:即使由于User.porotype的引用已更改而丢失链接,但为什么
user1.age
仍返回
20
而不是
未定义的


编辑:正如答案所提到的,这与原型无关,我感到困惑,因为我认为对象引用就像一个指针,而不是。当您重新分配
.prototype
属性时,这里已经回答了这一问题,以前内部原型指向旧原型的旧实例不会被更改。请参阅以下网站上的文档:

警告:根据现代JavaScript引擎优化属性访问的性质,更改对象的[[Prototype]]目前在每个浏览器和JavaScript引擎中都是非常缓慢的操作。此外,改变继承的影响是微妙而深远的,不仅限于在Object.setPrototypeOf(…)语句中花费的时间,还可以扩展到可以访问其[[Prototype]]已被改变的任何对象的任何代码

如果旧实例的原型自动更新,这将是一个非常昂贵的操作,并且可能会导致奇怪的故障。将新对象指定给
.prototype
只会影响新实例

如果您想更新现有实例的原型,您必须手动进行(仅供参考-首先要做的是一件非常奇怪的事情)

函数用户(){
}
const user1=新用户();
User.prototype={age:30};
setPrototypeOf(user1,User.prototype);
console.log(user1.age)

console.log(user1.\uuu proto\uuuu==User.prototype)
当您声明
const user1=new User()时
,在幕后您将获得
user1.\uuuuu proto\uuuuuu=User.prototype

稍后将
User.prototype
重新指定给另一个对象不会影响
user1.\uuuu proto\uuuuu
,该值将保持与以前相同,它将保留对原始prototype对象的引用

事实上,它与
原型
无关,它只是与对象的矫揉造作有关,如以下示例所示:

让obj1={a:2};
常数obj2=obj1;
obj1={b:2}

console.log(obj2);//打印{a:2}
好吧,您已经替换了对象。类“
prototype
和实例的
\uuuuuuuuuuu
现在是两个不同的对象。
User.prototype = {age: 30};

console.log(user1.age) // prints 20! , Why?, shouldn't it print 30?
console.log(user1.__proto__ === User.prototype) // prints false