【问题标题】:calculate the value of an obj key while using different key/values of the same object?在使用同一对象的不同键/值时计算 obj 键的值?
【发布时间】:2014-10-30 11:36:43
【问题描述】:

如何从同一对象内的 keyspageSizes.w/pageSize.h 计算 pageSize.offset?

   var pageSizes = {
              w: parseInt(scope.page.imagewidth),
              h: parseInt(scope.page.imageheight),
              offset: (pageSize.w/pageSize.h)
            }

   console.log('page.offset', pageSizes.offset);

目前我收到一个 RefferenceError: pageSize 未定义。

我假设这是不可能的。因此,最好的方法是什么?

【问题讨论】:

  • 带有泄漏的分配和临时变量:var x; {w: x= parseInt(scope.page.imagewidth), offset: w*2}
  • pageSizes 和 pageSize 有一个 s 的区别。更好的方法可能是计算对象外部的 w、h 和偏移量,然后根据这些创建对象。
  • 为了避免必须记住 offset 是一种方法而其他是属性,您可以在 offset 上使用 getter 或 @ 987654322@ 将其值设置在其他两个属性上(注意被零除)。或将名称更改为 getOffset
  • @Absor 您的方法有优化增益吗?请发布有原因的答案,我可以将其标记为正确吗?
  • @dandavis OPD 代表什么?

标签: javascript object


【解决方案1】:

使其成为一个函数并使用this

var pageSizes = {
          w: parseInt(scope.page.imagewidth, 10), //Dont forget the radix!
          h: parseInt(scope.page.imageheight, 10), //Dont forget the radix!
          offset: function() {
              return this.w/this.h;
          }
        }

console.log('page.offset', pageSizes.offset());

另外,不要忘记parseInt 函数中的基数

【讨论】:

  • 嘿,这算是闭包吗?对我来说还是那么模糊?
  • @tyme 已经给出了答案,抱歉我在发帖之前没有看到这个
  • @Absor 上面说最好不要这样做?他的想法合适吗?
  • 如果 w 和 h 在任何时候(并且可能是整体)发生变化,这实际上会更好。
【解决方案2】:

显然这适用于 firefox、opera、safari、chrome 甚至 IE9:

var pageSizes ={
          w: parseInt(scope.page.imagewidth, 10), //Dont forget the radix!
          h: parseInt(scope.page.imageheight, 10), //Dont forget the radix!
           get offset () {
              return this.w/this.h;
          }
 };

它就像方法一,但你不必调用它,让它像其他属性一样工作。

控制台友好版本:

    var pageSizes ={
              w: 5,
              h: 10,
               get offset () {
                  return this.w/this.h;
              }
     };

JSON.stringify(pageSizes); // == "{"w":5,"h":10,"offset":0.5}"

我一直将 Object.defineProperty (ODP) 用于 getter 和 setter,但这似乎比我想象的更受支持。你每天都学到一些东西。它看起来像一个错字,缺少冒号和“功能”等等,但它有效。很酷。

感谢 robG 的评论,这让我再次检查了 ref。

详情请见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get#Example:_Defining_a_getter_with_the_get_operator

【讨论】:

  • nm 它确实可以使用该 get 函数。它不会在 ie8 中工作,对吧?
  • IE9 启动,afaik;它不能被 polyfill,因为它是 jscript 引擎的语法错误。
【解决方案3】:

函数引用了特殊关键字“this”,它指向当前作用域(或父作用域直到全局作用域的原型作用域)或当前对象实例,此处指向 PageSizes 对象 使用这个

      var pageSizes = {
      w: parseInt(scope.page.imagewidth),
      h: parseInt(scope.page.imageheight),
      offset: function() {
          return this.w/this.h;
      }
    }

然后改变这一行,因为偏移它不是一个属性,它现在是一个函数

    console.log('page.offset', pageSizes.offset);

   console.log('page.offset', pageSizes.offset());

【讨论】:

    猜你喜欢
    • 2022-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多