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

Kil*_*roy 14 javascript console properties getter-setter node.js

在这段代码中:

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);
Run Code Online (Sandbox Code Playgroud)

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

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

qua*_*016 9

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

  • 虽然此代码可以回答这个问题,但提供有关如何和/或解决问题的原因的其他背景将提高答案的长期价值. (4认同)
  • Object.assign 函数在内部调用 getter 并返回一个 POJO(有一些注意事项)。来自 [MDN: Object.assign](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign): `"Object.assign() 方法仅复制可枚举的并拥有从源对象到目标对象的属性。它在源上使用 [[Get]] 在目标上使用 [[Set]],因此它将调用 getter 和 setter。因此它分配属性,而不是复制或定义新的属性属性。”` (2认同)

jib*_*jib 8

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


Llo*_*oyd 5

从 Nodejs v11.5.0 开始,您可以getters: trueutil.inspect选项中进行设置。请参阅此处的文档

getter <布尔值> | <string> 如果设置为 true,则检查 getter。如果设置为“get”,则仅检查没有相应 setter 的 getter。如果设置为“set”,则仅检查具有相应 setter 的 getter。这可能会导致副作用,具体取决于 getter 函数。默认值:假。


Ala*_*ape 1

在我的特定用例中,我无法导入本机检查模块,而且我也无法JSON.stringify对记录的对象执行此操作,因为其中存在循环引用。但是,我发现您可以将所有检查选项作为第二个参数传递给console.dir(obj, options). 因此,以下内容对我有用:

console.dir(myObj, { getters: true });
Run Code Online (Sandbox Code Playgroud)