对象获取访问者不返回预期值

时间:2013-11-17 04:01:19

标签: javascript

我现在正在学习OO JS而且我无法理解为什么这不起作用:

var dog = {

    name: {

        value: 'PENNY',

        get: function() {
            return this.name; // returns [object Object]
        }
    }
};

alert(dog.name);

我显然做错了什么但我不知道是什么。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:3)

dog上name属性的值是一个具有get()方法的对象。如果您将代码更改为:

var dog = {

    name: {

        value: 'PENNY',

        get: function() {
            return this.value; // Change to 'value'.  returns 'PENNY'
        }
    }
};

alert(dog.name.get()); // Change to call the get() method on the name object

您将获得正确的名称。但是您可能希望在读取属性时自动调用name函数。在这种情况下,您可以将其更改为:

var dog = {

    value: 'PENNY',

    get name() {
        return this.value; // returns 'PENNY'
    }

};

alert(dog.name);

使用getter语法定义名为name的属性,该属性在读取属性时将调用指定的函数。

答案 1 :(得分:2)

您应该使用console.log(dog.name)来检查对象。

正如您刚刚发现的那样,

Alert是调试Javascript的一种非常笨拙的方式。您在警告框中看到的是采用名称对象的toString方法的结果。在许多Javascript实现中,toString返回“[object Object]”作为打印对象“值”的方式

在这种情况下,您间接获得dog.name.toString(),因为name是一个对象,所以它会打印[object Object]

我在您的代码中包含了一个JSFiddle,后跟一个console.log语句。 http://jsfiddle.net/us9TL/如果您打开开发人员工具并运行javascript,则可以比较同一对象的两个输出。

要查看console.log的输出,您需要打开浏览器的开发人员工具。

打开开发者工具的说明: 对于Chrome:https://developers.google.com/chrome-developer-tools/ 对于Firefox:https://developer.mozilla.org/en-US/docs/Tools/Web_Console

答案 2 :(得分:1)

如果您尝试按我认为的那样做,那么您的语法就不正确了。试试这个:

var dog = {

    name: {

        _val: 'PENNY',

        get value() {
            return this._val; // returns 'PENNY'
        }
    }
};

console.log(dog.name.value);

http://jsfiddle.net/9Jq9h/

答案 3 :(得分:0)

为什么不......?

var dog = {
    name : 'PENNY',

    get: function() {
        return this.name;
    }
};

您遇到的是您将名称定义为name : {},其中{}是对象的表示法。该对象具有另一个名为value的值,它是一个字符串。使用您的逻辑,您应该像this.value一样访问它(thisname对象的标识符,而不是dog对象,因为范围)。