问题 如何让console.log输出getter结果而不是字符串“[Getter / Setter]”?


在这段代码中:

function Cls() {
    this._id = 0;
    Object.defineProperty(this, 'id', {
        get: function() {
            return this._id;
        },
        set: function(id) {
            this._id = id;
        },
        enumerable: true
    });
};
var obj = new Cls();
obj.id = 123;
console.log(obj);
console.log(obj.id);

我想得到{_id:123,id:123} 但我得到{_id:123,id:[Getter / Setter]}

有没有办法让console.log函数使用getter值?


7574
2018-01-21 16:55


起源

如果单击输出 [getter] 在控制台中,它应该被执行并演变为值。 - Bergi
@Bergi,看起来代码是在node.js中执行的,因为它的标记,OP无法点击它。 - Patrick Evans
@PatrickEvans:当然是哎呀。不确定是否 util.inspect 会有所帮助吗? - Bergi
我知道如何获得价值,我不知道的是如何设计一个类或库,因此它对该lib的用户是透明的。我不希望它出现任何其他方式,然后是一个干净的价值。 - Killroy
也许toString()的valueOf()有用吗?我也喜欢浏览器端的soem帮助。我目前得到三个项目,getter,setter和一个链接的...值,当点击时返回正确的项目。毋庸置疑,这真的会淹没我的控制台输出! - Killroy


答案:


使用 console.log(JSON.stringify(obj));


7
2018-01-21 17:06



除了方法和递归引用,这些对象的任何建议? - dandavis
我不需要知道如何以其他方式打印值。毕竟console.log(obj.id)就是这么做的。我需要弄清楚如何让console.log在getter / setter属性上的行为与原始值相同。 - Killroy
这里没有一个通用的解决方案,但使用JSON.stringify并添加一个 toJSON 对象的方法似乎是最好的解决方案: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...  - 您也可以使用一些反射和自动化toJSON Object.defineProperty( ... { value: }) - Cory Mawhorter


您可以使用 console.log(Object.assign({}, obj));


6
2018-06-19 15:11



虽然此代码可以回答这个问题,但提供有关如何和/或解决问题的原因的其他背景将提高答案的长期价值。 - Badacadabra


你可以定义一个 inspect 对象上的方法,并导出您感兴趣的属性。请参阅此处的文档: https://nodejs.org/api/util.html#util_custom_inspection_functions_on_objects

我猜它会是这样的:

function Cls() {
    this._id = 0;
    Object.defineProperty(this, 'id', {
        get: function() {
            return this._id;
        },
        set: function(id) {
            this._id = id;
        },
        enumerable: true
    });
};

Cls.prototype.inspect = function(depth, options) {
    return `{ 'id': ${this._id} }`
}

var obj = new Cls();
obj.id = 123;
console.log(obj);
console.log(obj.id);

2
2018-04-11 21:41



这适用于console.log()吗?文档只提到utils.inspect。理想情况下,我正在寻找对用户透明的东西。如果用户必须执行除了普通的console.log()以外的其他操作,他们也可以手动检查getter。 - Killroy
是啊, console.log 电话 util.inspect: nodejs.org/api/console.html#console_console_log_data_args - Ryan Quinn