gpt4 book ai didi

javascript - 带有嵌套对象的原型(prototype)继承

转载 作者:行者123 更新时间:2023-12-01 03:51:48 25 4
gpt4 key购买 nike

我正在尝试了解 Javascript 中的原型(prototype)继承。我想我已经了解了基本概念,但是当我在玩这个时,我遇到了以下问题,这仍然让我感到困惑。

有一个非常相似的问答here但它并没有完全回答为什么发生这种情况,至少对我来说不是。

我创建一个像这样的新对象:

var User = {
username: "",
name: {
first: "",
last: ""
}
}

接下来我创建该对象的两个“实例”:

var user1 = Object.create(User);
var user2 = Object.create(User);

现在我像这样设置 name 属性:

user1.name = { first: "John", last: "Jackson"}
user2.name = { first: "James", last: "Jameson"}

现在我做到了

alert(user1.name.first)\\-> Johnalert(user2.name.first)\\-> James

一切如预期。到目前为止一切顺利。

但是,如果我像这样设置 name.first 属性:

user1.name.first = "John";
user2.name.first = "James";

我明白了

alert(user1.name.first) \\ -> James
alert(user2.name.first) \\ -> James

显然,现在该属性是在原型(prototype)对象User(或者更确切地说是包含的name对象)上设置的,而不是在当前对象user1<中覆盖它。为什么会出现这种情况?

如果我这样做

user1.name.middle = "Mortimer"

我现在可以做

alert(User.name.middle) // -> Mortimer

这不是我所期望的。通常,每当在派生对象上设置属性时,该对象要么已经将该属性作为 ownProperty 在这种情况下简单地分配该值,要么将该属性新创建为 ownProperty 在派生对象上,覆盖原型(prototype)属性。就像我分配给 user1.name 时发生的情况一样。

那么为什么分配给原型(prototype)对象中包含的对象会导致这种(至少对我来说)意外且违反直觉的行为?

按照我的理解,当进行分配时,第一个检查是查看 user1 是否有一个名为 nameownProperty,其中事实并非如此。如果这是一个读取操作,现在将查找 prototype 属性并检查 User 以查看它是否具有 ownProperty name.但既然这是一个集合操作,为什么在通常简单地创建一个缺失的 ownProperty 时还要走原型(prototype)链呢?

最佳答案

But since this is a set operation why walk the prototype chain when usually a missing ownProperty is simply created?

当您说 user1.name.first = "John" 时,user1.name 部分必须在 .first 之前解析可以检索或设置属性。在您的示例中,user1.name 部分仅存在于原型(prototype)对象上,因此它是您要设置其 .first 属性的那个对象。

类似地,当您说 user1.name.middle = "Mortimer" 时,user1.name 部分再次解析为原型(prototype)中的嵌套对象,因此您可以在that对象上创建一个.middle属性,这就是为什么User.name.middle也返回“Mortimer” .

如果您说 user1.name.firstuser1.name 无法解析(在当前对象或其原​​型链中),那么您将得到一个类型错误:无法设置未定义的属性“first”。 (您可以通过说 user1.address.street = "something" 在现有代码中尝试这个概念 - 您会得到 TypeError,因为 user1.address 不存在于 user1 或其原型(prototype)链上。)

关于javascript - 带有嵌套对象的原型(prototype)继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43113044/

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