【问题标题】:how to make properties of an object update correctly when used in a new object?在新对象中使用时如何正确更新对象的属性?
【发布时间】:2021-08-24 09:50:42
【问题描述】:

https://jsfiddle.net/ca4xvkzb/

    function foo(a,b)
    {
        this.a = a
      this.b = b
      this.bar = a+b
    }
    var z = new foo();
    z.a = 2
    z.b = 3
    console.log(z.bar)

目前发生了什么:

z.bar 返回 NaN,进一步测试表明,虽然 z.az.b 正在更新它们的值,但 z 中的 this.bar 使用 a 和 b 的旧未定义值,而不是更新后的值

我需要做什么:

z.bar 应该正确返回 a+b 的值:5,在对象定义之后设置它们之后,因为我想使用 foo 对象来获取更多变量,而不仅仅是 z

【问题讨论】:

  • z.bar 应该是一个在需要时计算总和的函数,或者您应该在创建 z 时将正确的参数传递给构造函数。
  • this.bar = () => { return this.a + this.b }; console.log(z.bar())
  • this.bar 应该是这样的函数并从中返回总和
  • 正如上面的 cmets 已经说过的,bar 应该是一个函数。再放大一点:现在发生的情况是,bar 是一个设置为 ab 之和的值,但仅适用于在调用它时传递给函数的任何内容(或在此new foo() 的构造函数中的大小写。如果您说new foo(2,3)bar 将具有正确的值,但它不是是动态的,该值将是固定的。如上图所示, 需要一个函数。下面是小提琴中的相同代码:jsfiddle.net/61to4eus(注意在 bar 之后的函数调用 ()

标签: javascript object oop


【解决方案1】:

你可以这样使用它:

function foo(a,b)
{
  this.a = a
  this.b = b
  this.bar = ()=> this.a + this.b
}
var z = new foo();
z.a = 2
z.b = 3
console.log(z.bar())

【讨论】:

  • 很抱歉,但不得不投反对票。这将需要每次使用 foo 来设置 bar 在函数之外。如果您像 (this.bar= ) 那样在函数内移动 z.bar=,它会更有意义。如果你改变它,我可以取消投票;)
【解决方案2】:

正如 walidum 所说,您正在创建 bar 函数作为 foo 实例的 ownProperty。我认为将 bar 作为 foo 类的函数包含在prototype 中会更有意义:

function foo(a,b) {
  this.a = a;
  this.b = b;
}
foo.prototype.bar = function(){ return this.a + this.b; };


var z = new foo();
z.a = 2
z.b = 3
console.log(z.bar()); // = 5
console.log(z.hasOwnProperty('a')); // = true -- because it's something that belongs to THIS very instance of foo
console.log(z.hasOwnProperty('bar')); // = false -- because the function does not belong to the instance, but to the class (all instances of) foo.

【讨论】:

    猜你喜欢
    • 2016-09-13
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 2020-03-29
    • 2021-08-12
    • 1970-01-01
    相关资源
    最近更新 更多