2

我正在将一些旧代码转换为 Javascript 中的对象文字表示法,恐怕我遇到了一些麻烦。我知道如何定义属性,也知道如何定义方法,但是如果我想将方法​​的返回值作为属性分配怎么办?

我已经提供了来自 Chrome 控制台的错误输出代码。我看不出我做错了什么,但控制台告诉我,我要么试图找到全局范围内不存在的东西,要么只是尝试不存在的东西。这里是:

代码:

var testobj = {
    a: 2,
    b: 4,
    c: function() {
        return this.a * this.b;
    },
    d: this.c(), // OK, got it, it's trying to call it from global scope. Fine.
    e: function() {
        if (this.d) {
            console.log("SUCCESS");
            console.log(this.d);
        } else {
            console.log("ERROR");
        }
    }
}

错误:

TypeError: Object [object global] has no method 'c'

新代码:

var testobj = {
    a: 2,
    b: 4,
    c: function() {
        return this.a * this.b;
    },
    d: testobj.c(), // but if I change it like this, it still doesn't work. What gives?
    e: function() {
        if (this.d) {
            console.log("SUCCESS");
            console.log(this.d);
        } else {
            console.log("ERROR");
        }
    }
}

新错误:

TypeError: Cannot call method 'c' of undefined

谁能看到我做错了什么?

4

3 回答 3

3

您可以使用以下方法修复它:

var testobj = {
    a: 2,
    b: 4,
    c: function() {
        return this.a * this.b;
    },
    d: function() {
        return this.c();
    },
    e: function() {
        if (this.d) {
            console.log("SUCCESS");
            console.log(this.d);
        } else {
            console.log("ERROR");
        }
    }
}

当你这样做时d: this.c()this实际上是全局对象。这是因为,在创建时testobj,范围是全局对象,this全局对象也是。

如果你使用

d: function() {
    return this.c();
}

您只是设置testobj.c为某个功能。该this函数的内部仅在您调用d. 因此,当您调用时d,它会检查范围并查看范围是否为testobj. 并且testobj有一个c函数,它调用并返回它。

我已经把它放在一个jsFiddle中以查看它的实际效果。

于 2013-06-21T09:25:00.200 回答
0

这有效((http://jsfiddle.net/balintbako/n6YjE/):

var testobj = {
    a: 2,
    b: 4,
    c: function () {
        alert(this.a + this.b);
    },
    d: function () {
        this.c();
    }
};

testobj.c();
于 2013-06-21T09:24:53.170 回答
0

相信你想看d中c的返回值。

在这种情况下,我在对象之后分配 d ,因为它没有任何实例,var ob = {...}因为它仍在创建中。

var testobj = {
    a: 2,
    b: 4,
    c: function() {
        return this.a * this.b;
    },
    e: function() {
        if (this.d) {
            console.log("SUCCESS");
            console.log(this.d);
        } else {
            console.log("ERROR");
        }
    }
}

testobj.d = testobj.c();

alert(testobj.d);
alert(testobj.c());
于 2013-06-21T09:32:35.130 回答