gpt4 book ai didi

javascript - 为什么替换原来的原型(prototype)对象后旧的原型(prototype)属性仍然可用

转载 作者:行者123 更新时间:2023-12-03 12:11:17 26 4
gpt4 key购买 nike

我知道原型(prototype)属性本质上是动态的,并且对象仅传递相同属性的引用。每当您更改它们时,都会在运行时显示更改的结果。但在重新定义原型(prototype)对象的情况下,在重新定义原型(prototype)之前创建的对象仍然指向旧的原型(prototype)对象。以此为例:

var Person=function(firstName,lastName)
{
this.firstName=firstName;
this.lastName=lastName;
}

Person.prototype.getFullName=function()
{
return this.firstName+" "+this.lastName;
}
var student=new Person("Ankur","Aggarwal");
student.getFullName() //returns "Ankur Aggarwal"

Person.prototype.getFullName=function()
{
return "I am changed";
}

student.getFullName() //returns "I am changed"

到这里我就明白了这个场景。但是如果我再次重新定义原型(prototype),学生就不会指向新原型(prototype)。它仍然仅指向旧原型(prototype)

Person.prototype={}
student.getFullName() //still works why?

我在网上搜索了相关内容,但无法理解。请帮帮我

最佳答案

因为创建的实例和 Person.prototype property 之间没有直接链接,只有它引用的对象。当您执行 new Person() 时,生成的实例的底层原型(prototype)将设置为 Person.prototype 引用的对象当时。 p>

这也是我在这里仍然得到 5 的原因:

var a = [1, 2, 3, 4, 5];
var b = a;
var a = []
console.log(b.length);

ASCII-art 可以在这里提供帮助。 :-)

最初,您拥有 Person 函数,其 prototype 属性引用具有 getFullName 函数的对象:

+-----------+|  Person   |+-----------+     +-------------+| prototype |---->|  (object)   |+-----------+     +-------------+     +------------+                  | getFullName |---->| (function) |                  +-------------+     +------------+                                      | ...        |                                      +------------+

然后使用 var Student=new Person("Ankur","Aggarwal"); 创建它的实例:

+-----------+|  Person   |+-----------+     +-------------+| prototype |--+->|  (object)   |+-----------+  |  +-------------+     +------------+               |  | getFullName |---->| (function) |               |  +-------------+     +------------++-----------+  |                      | ...        ||  student  |  |                      +------------++-----------+  || __proto__ |--+| ...       |+-----------+

然后你给 Person.prototype 一个新值,但这对 student 与其底层原型(prototype)的连接没有影响:

+-----------+|  Person   |+-----------+     +-------------+| prototype |---->|  (object)   |+-----------+     +-------------++-----------+|  student  |+-----------+      +-------------+| __proto__ |----->|  (object)   || ...       |      +-------------+     +------------++-----------+      | getFullName |---->| (function) |                   +-------------+     +------------+                                       | ...        |                                       +------------+
<小时/>

旁注:__proto__ 并不是字面上的属性名称,尽管从 ES6 开始它是。在 ES5 及更早版本中,对象的底层原型(prototype)无法作为属性进行访问,除非在具有非标准扩展的引擎上。

<小时/>

我说过实例和 Person.prototype 之间没有直接链接,这是事实。有一个间接链接,但它与问题并不真正相关。如果您不是学究,请立即停止阅读。好吧,对于学究来说:Person.prototype 引用的初始对象有一个属性 constructor,它引用 Person。因此,即使在更新 Person.prototype 后,student 仍具有其原型(prototype)的链接,该原型(prototype)具有引用 Person 的 constructor 属性,其中有 Person.prototype。不影响问题,但我想我应该提一下。

关于javascript - 为什么替换原来的原型(prototype)对象后旧的原型(prototype)属性仍然可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24952595/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com