javascript - 我不明白为什么设置在具有 set 属性的构造函数的执行上下文中定义的值不会更改该值

标签 javascript

在下面的代码片段中,我使用在实例上定义的 set 函数将 _value 设置为 45。看起来 _value 是在我使用 setValue 属性时在实例上定义的,但是当我调用 logValue() 时,我得到 25。如果我取消注释对 yo() 的调用,输出将变为:

25
25
45

代码片段:

var constructor = function() {
  var _value = 25;
  constructor.yo = function() {
    console.log(_value);
  }
  constructor.prototype.logValue = function() {
    console.log(_value);
  }
  Object.defineProperty(this, "getValue", { get: function() {return _value;}});
  Object.defineProperty(this, "setValue", { set: function(input) { _value = input;}});
};
var instance = new constructor();
var instance2 = new constructor();
instance.setValue = 45;
instance.logValue();
//constructor.yo();
console.log(instance.getValue);

最佳答案

_value 变量是 constructor() 函数的局部变量。每次调用 constructor() 时都会创建该变量的一个新实例。现在,在该函数中,每次调用它时,您还重新创建了 yo() 函数作为 constructor() 函数的属性。这意味着在第二次调用 constructor() 时,“yo”属性的先前值将被新函数覆盖。

因此,当您通过 second 实例对象修改 _value 时,您是在修改 _value 中创建的闭包中的变量 < em>第二次 调用 constructor()。因为只有一个“yo”属性,所以调用时将记录该值。

如果您要创建第三个实例,您会看到相同的效果:“yo”将再次被覆盖,并且值(在您更改之前)将恢复为默认值 25 当通过“yo”询问时。

虽然在这样的函数中设置像“yo”属性这样的属性并不完全是错误,但在这种情况下并不清楚它完成了什么。将“yo”作为构造对象的属性而不是构造函数本身可能会更好。

编辑 — Felix Kling 正确地指出,在构造函数内部 的原型(prototype)上重新定义logValue() 将产生类似(不良)的效果。

关于javascript - 我不明白为什么设置在具有 set 属性的构造函数的执行上下文中定义的值不会更改该值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42161287/

相关文章:

javascript - Express Handlebars 自定义路径

javascript - 如何使用 Handlebars 渲染斜体/粗体文本?

javascript - 导航不对齐

javascript - 警告 : Memory Router ignores the history props

javascript - 如何使用 Backbone.js 表示页面的二维网格?

javascript - 为什么 React CLI 不将模板安装为 typescript ?

javascript - 如何为表中的多个数据创建 AJAX POST 按钮?

javascript isNaN() 函数不起作用?

javascript - 按回车键时如何选择网格第一行?

javascript - 按浏览器刷新按钮后不会调用嵌套异步调用