【问题标题】:Calculated/transient fields in JavaScriptJavaScript 中的计算/瞬态字段
【发布时间】:2012-07-07 17:58:00
【问题描述】:

我正在尝试使用 OO JavaScript 实现以下目标:

class Sample
{
  public int x {get; set;}
  public int y {get; set;}

  public int z
  {
    get {return x+y;}
  }
}

我不明白如何在上面的类中实现属性“z”。

【问题讨论】:

  • 这看起来像 Java,而不是 JavaScript。你是说你想在 JavaScript 中实现类似的东西吗? (“x”和“y”的值的语法也不熟悉。)
  • 在我看来更像 C#。但是,您是如何实现课程的其余部分的?
  • @Niko 是的,你可能是对的 :-)
  • 代码在 C# 中只是为了解释我在 JavaScript(不是 Java)中寻找什么。

标签: javascript


【解决方案1】:

你必须使用一个函数。从 ECMAScript 第 5 版 (ES5) 开始,该函数可以成为您以正常非函数方式访问的属性的“getter”;在此之前,您必须使用显式函数调用。

这是 ES5 的方式,使用 defineProperty: Live copy | source

function Sample()
{
    // Optionally set this.x and this.y here

    // Define the z property
    Object.defineProperty(this, "z", {
        get: function() {
            return this.x + this.y;
        }
    });
}

用法:

var s = new Sample();
s.x = 3;
s.y = 4;
console.log(s.z); // "7"

使用 ES3(例如,早期版本):

function Sample()
{
    // Optionally set this.x and this.y here
}
Sample.prototype.getZ = function() {
    return this.x + this.y;
};

用法:

var s = new Sample();
s.x = 3;
s.y = 4;
console.log(s.getZ()); // "7"

请注意,您必须实际调用函数getZ(),而 ES5 可以使其成为属性访问(只需 z)。


请注意,JavaScript(还)没有class 功能(尽管它是一个保留字并且即将推出)。您可以通过构造函数和原型来创建对象类,因为 JavaScript 是一种原型语言。 (嗯,它有点混合。)如果你开始进入层次结构,就会开始有一些重要的、重复的管道。有关更多信息,请参阅 Stack Overflow 上的this other answer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-01
    • 2016-09-28
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多