JavaScript 对象如何引用自身的值?

IT技术 javascript object
2021-01-18 03:21:01

假设我有以下 JavaScript:

var obj = {
 key1 : "it ",
 key2 : key1 + " works!"
};
alert(obj.key2);

此错误与“key1 未定义”有关。我努力了

this.key1
this[key1]
obj.key1
obj[key1]
this["key1"]
obj["key1"]

他们似乎从未被定义过。

如何让 key2 引用 key1 的值?

6个回答

也许您可以考虑删除函数的属性。我的意思是这样的:

var obj = {
  key1: "it ",
  key2: function() {
    return this.key1 + " works!";
  }
};

alert(obj.key2());

在 ES6 中,您可以替换key2 : function() {...}get key2() {...},然后在调用时不需要使用括号:alert(obj.key2);
2021-03-15 03:21:01
@OmarSharaki,pencilCake 的功能和你的功能都是匿名的。您的不起作用的原因是您使用的箭头函数看不到this. 比我在这里解释的要多得多,但肖恩·维埃拉 (Sean Vieira) 对这个问题的回答很好地解释了它。
2021-03-19 03:21:01
知道如果使用匿名函数为什么会返回 undefined 吗? key2: ()=>this.key1+" works!"
2021-03-29 03:21:01
它只有在你有一个 flat 时才有效obj,就像你例子中的那个。如果您有嵌套的键,它将不起作用。
2021-03-30 03:21:01
@Green True,但您始终可以在创建对象后立即将其分配给绑定函数。 var obj = { ... }; obj.nested.func = function() { ... }.bind(obj);
2021-04-05 03:21:01

这可以通过使用构造函数而不是文字来实现

var o = new function() {
  this.foo = "it";
  this.bar = this.foo + " works"
}

alert(o.bar)

在初始化该对象之前,您不能引用该对象的属性;使用外部变量。

var key1 = "it";
var obj = {
  key1 : key1,
  key2 : key1 + " works!"
};

此外,这不是“JSON 对象”;它是一个 Javascript 对象。JSON 是一种用字符串(恰好是有效的 Javascript 代码)表示对象的方法。

一种替代方法是使用 getter/setter 方法。

例如,如果您只关心读取计算值:

var book  = {}

Object.defineProperties(book,{
    key1: { value: "it", enumerable: true },
    key2: {
        enumerable: true,
        get: function(){
            return this.key1 + " works!";
        }
    }
});

console.log(book.key2); //prints "it works!"

但是,上面的代码不会让您为 key2 定义另一个值。

因此,如果您还想重新定义 key2 的值​​,事情会变得更加复杂。它始终是一个计算值。很可能这就是你想要的。

但是,如果您希望能够重新定义 key2 的值​​,那么您将需要一个独立于计算的地方来缓存其值。

有点像这样:

var book  = { _key2: " works!" }

Object.defineProperties(book,{
    key1: { value: "it", enumerable: true},
    _key2: { enumerable: false},
    key2: {
        enumerable: true,
        get: function(){
            return this.key1 + this._key2;
        },
        set: function(newValue){
            this._key2 = newValue;
        }
    }
});

console.log(book.key2); //it works!

book.key2 = " doesn't work!";
console.log(book.key2); //it doesn't work!

for(var key in book){
    //prints both key1 and key2, but not _key2
    console.log(key + ":" + book[key]); 
}

另一个有趣的选择是使用自初始化对象:

var obj = ({
  x: "it",
  init: function(){
    this.y = this.x + " works!";
    return this;
  }
}).init();

console.log(obj.y); //it works!
我喜欢自初始化对象的方式。谢谢
2021-03-16 03:21:01

因为语句定义obj还没有完成,key1还不存在。考虑这个解决方案:

var obj = { key1: "it" };
obj.key2 = obj.key1 + ' ' + 'works!';
// obj.key2 is now 'it works!'
不错的解决方案,对象尚未完成其执行阶段是有道理的,因此调用其中的键将是未定义的。对象是函数,因此在执行阶段结束之前,不会在内存中定义其中的键
2021-03-16 03:21:01