gpt4 book ai didi

javascript - 对象原型(prototype)没有 "live update"

转载 作者:行者123 更新时间:2023-11-28 15:50:27 24 4
gpt4 key购买 nike

我有以下代码:

var Test = function () {
};
Test.prototype.doSomething = function() {
return "done";
};

现在,我创建一个 Test 对象

var t = new Test();
alert(t.doSomething()); // Correct alerts "done"

现在我向原型(prototype)添加另一个方法:

Test.prototype.fly = function() { return "fly"; };
alert(t.fly()); // Correctly alerts "fly" (existing objects get "live udpated")

现在,我使原型(prototype)指向一个空白对象:

Test.prototype = {};
alert(t.doSomething()); // Continues to alert "done", but why?
alert(t.fly()); // Continues to alert "fly", but why?

var t2 = new Test();
alert(t.doSomething()); // As expected, this does not work
  1. 当我向原型(prototype)添加方法时,它会正确反射(reflect)所有新的和现有的对象

  2. 当我通过执行 <name>.prototype = {}; 来“清空”原型(prototype)时,它只会“删除”新实例,而不删除现有实例。为什么?

最佳答案

打个比方:

var a = {foo : 'bar'};
var b = a; //the same object as a
var c = a;
var d = a;

a.apple = 'orange';

a = 1; //a === 1. b, c and d stay the same, pointing to the object with apple

我在这里所做的是替换 a 所指向的内容,而不是对象本身。

当您添加fly时,您正在修改所有实例共享的单个原型(prototype)对象,即Test.prototype当前指向的对象。

但是当您将空白对象分配给 Test.prototype 时,您修改了 Test.prototype 所指向的内容。它不会修改现有实例所指向的内容。但从现在开始,任何新实例都将使用 Test.prototype 上的新对象作为其原型(prototype)对象。

如果您熟悉 C,我宁愿将 JS 变量视为指针而不是引用。

关于javascript - 对象原型(prototype)没有 "live update",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20801739/

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