gpt4 book ai didi

javascript - getter 和 setter 是避免原型(prototype)突变的唯一方法吗?

转载 作者:行者123 更新时间:2023-11-29 10:41:44 24 4
gpt4 key购买 nike

我有一个 JavaScript 对象,我想扩展它。问题是它的变量从一个范围变异到另一个范围。

首先我创建了一个Mammal原型(prototype),他有一个名字,这个名字可以用whoAmI函数打印出来

var Mammal = ( function () {

var whoAmI = function () {
console.log("I am " + this.name);
};

return {
name : "mammal",
whoAmI : whoAmI
};

})();

然后,我创建了一只狗,它也有名字。它的名称可以直接从 whoAmIstate 函数打印出来。

var Dog = ( function (mammal) {
mammal.name = "dog";

mammal.state = function () {
mammal.whoAmI();
console.log("I am happy");
};

return mammal;

})(Object.create(Mammal));

但是当我想创建一个 Dog 的实例,并从外部设置他的名字时,似乎有两个 name 变量:一个在 Dog 中,另一个在新创建的变量中 石坡.

var shipo = Object.create(Dog);
shipo.name = "Shipo"
shipo.state(); // it's name is dog
shipo.whoAmI(); // it's name is Shipo
// mutation? :(

我可以通过在 Mammal 定义上为 name 变量实现一个 getter 和 setter 函数来解决这个问题...但是我讨厌使用 getter 和 setter,如果变量是我的代码会更短可以在没有这个丑陋功能的情况下公开设置和获取...

getter 和 setter 是防止这种突变的唯一方法吗?

最佳答案

这种情况下的修复非常简单:只需调用 this.whoAmI() 而不是 mammal.whoAmI() 来访问当前对象而不是其原型(prototype)属性:

var Dog = ( function (mammal) {
mammal.name = "dog";
mammal.state = function () {
this.whoAmI();
console.log("I am happy");
};
return mammal;
})(Object.create(Mammal));

将给出预期的结果:

I am Shipo
I am happy
I am Shipo

这里是继承链的简化方案:

+--------------+       +--------------+   
| Mammal | +--> | Dog |
+--------------+ | +--------------+
| __proto__ |--+ | __proto__ |
+--------------+ +--------------+
| name: mammal | | name: dog |
| whoAmI() | | state() |
+--------------+ +--------------+

从这个表中很容易看出,如果 Dog 的实例调用了 state 方法,您希望它在当前 this 上被调用对象,以便它可以拾取 this.name,而不是 mammal.name

关于javascript - getter 和 setter 是避免原型(prototype)突变的唯一方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27788402/

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