【问题标题】:Object properties referencing other object properties in JavaScript对象属性引用 JavaScript 中的其他对象属性
【发布时间】:2013-12-11 17:25:35
【问题描述】:

我愿意:

outerobject={
    a: 1,
    b: 2,
    c: this.a + this.b,
};

console.log(outerobject.a);
console.log(outerobject.b);
console.log(outerobject.c);

我希望:

1
2
3

我明白了:

1
2
NaN

为什么我会得到一个 NaN?

【问题讨论】:

  • 因为this 不是outerobject。在代码顶部添加"use strict";,您将收到一条很好的错误消息,而不是无声的失败:TypeError: Cannot read property 'a' of undefined
  • this
  • @Blender:如果代码在全局运行,或者在设置了this 的函数中运行,则在严格模式下不会出错。

标签: javascript


【解决方案1】:

在对象this 内分配了对window 或全局对象的引用。您需要使用一个让this 引用对象引用的函数。

var outerobject={ a: 1, b: 2, c: function(){return this.a + this.b}};
var outerobject2={ a: 1, b: 2, c: console.log(this)}; //logs window/global object

console.log(outerobject.c());//outputs 3

或使用函数构造函数:

function MyObject(){
    this.a = 1;
    this.b = 2;
    this.c = this.a + this.b;
    console.log(this);
}

var myObject = new MyObject();

关键是function决定了this的范围。当函数作为对象的方法被调用时,其this 被设置为调用该方法的对象。

JS 小提琴: http://jsfiddle.net/aRFLn/

Read More

【讨论】:

  • 解释是正确的,但我不会使用建议的解决方案。使用方法需要调用不同的语法(顺便说一句,应该称为getC()),并且在构造函数中创建的属性不会像人们期望的那样更新它的值。
  • @Pavlo 关于函数构造函数的好点,我想如果对象发生变化就不会那么好
  • 一切都取决于 OP 是否打算仅在初始化或对该属性的每次访问中使用它。问题中没有提供太多背景信息。
【解决方案2】:

您可能希望获得属性值ab 的总和。为此,您需要getter

var outerobject = {
    a: 1, // inside a property value `this` is `window`
    b: 2,
    get c() {
        return this.a + this.b; // inside a getter function 'this' is `outerobject`
    }
};

然后你可以使用outerobject.c。每次调用它时也会重新评估它:

outerobject.c; // 3
outerobject.a++;
outeobject.c; // 4

【讨论】:

  • @palvo 语法正确吗?我认为对象的属性采用 key:value 的关联哈希形式
  • @KevinBowersox:他的语法是正确的(ECMAScript 5)。当然,您可以将代码复制到控制台中进行测试。
  • @BlueSkies 除非他使用的是 IE 8 :)
  • 是的,它被称为吸气剂。 (不记得这是否是规范术语。)请参阅答案中的链接。还有一个 setter 语法。
  • @BlueSkies 谢谢,在回答问题时学到了一些新东西。
【解决方案3】:

在您的情况下,“this”可能是任意数量的东西,具体取决于调用它的位置。在您的情况下,它很可能是 window 对象。因为window 可能没有定义ab,所以你得到NaN

这是一个很好的例子,说明它是如何工作的:http://www.quirksmode.org/js/this.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    相关资源
    最近更新 更多