我现在正在学习OO JS而且我无法理解为什么这不起作用:
var dog = {
name: {
value: 'PENNY',
get: function() {
return this.name; // returns [object Object]
}
}
};
alert(dog.name);
我显然做错了什么但我不知道是什么。任何帮助将不胜感激。
答案 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);
答案 3 :(得分:0)
为什么不......?
var dog = {
name : 'PENNY',
get: function() {
return this.name;
}
};
您遇到的是您将名称定义为name : {}
,其中{}
是对象的表示法。该对象具有另一个名为value
的值,它是一个字符串。使用您的逻辑,您应该像this.value
一样访问它(this
是name
对象的标识符,而不是dog
对象,因为范围)。