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