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

时间:2015-01-21 16:55:41

标签: javascript node.js properties console 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值?

6 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:7)

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

答案 2 :(得分:3)

您可以在对象上定义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);

答案 3 :(得分:1)

在Node.js上,我建议使用util.inspect.custom,这将使您可以漂亮地将吸气剂打印为值,同时保持其他属性的输出不变。

它仅适用于您的特定对象,不会弄乱常规console.log输出。

Object.assign相比,主要好处是它发生在对象上,因此您可以保留常规的通用console.log(object)语法。您不必用console.log(Object.assign({}, object))包裹它。

将以下方法添加到您的对象中:

[util.inspect.custom](depth, options) {
    const getters = Object.keys(this);
    /*
        for getters set on prototype, use instead:
        const prototype = Object.getPrototypeOf(this);
        const getters = Object.keys(prototype);
    */
    const properties = getters.map((getter) => [getter, this[getter]]);
    const defined = properties.filter(([, value]) => value !== undefined);
    const plain = Object.fromEntries(defined);
    const object = Object.create(this, Object.getOwnPropertyDescriptors(plain));
    // disable custom after the object has been processed once to avoid infinite looping
    Object.defineProperty(object, util.inspect.custom, {});
    return util.inspect(object, {
        ...options,
        depth: options.depth === null ? null : options.depth - 1,
    });
}

这是您所处环境中的一个有效示例:

const util = require('util');

function Cls() {
    this._id = 0;
    Object.defineProperty(this, 'id', {
        get: function() {
            return this._id;
        },
        set: function(id) {
            this._id = id;
        },
        enumerable: true
    });
    this[util.inspect.custom] = function(depth, options) {
    const getters = Object.keys(this);
    /*
        for getters set on prototype, use instead:
        const prototype = Object.getPrototypeOf(this);
        const getters = Object.keys(prototype);
    */
    const properties = getters.map((getter) => [getter, this[getter]]);
    const defined = properties.filter(([, value]) => value !== undefined);
    const plain = Object.fromEntries(defined);
    const object = Object.create(this, Object.getOwnPropertyDescriptors(plain));
    // disable custom after the object has been processed once to avoid infinite looping
    Object.defineProperty(object, util.inspect.custom, {});
    return util.inspect(object, {
        ...options,
        depth: options.depth === null ? null : options.depth - 1,
    });
}
};
var obj = new Cls();
obj.id = 123;
console.log(obj);
console.log(obj.id);

输出:

Cls { _id: 123, id: 123 }
123

答案 4 :(得分:0)

我需要一个漂亮的打印对象,没有getter和setter,而普通的JSON会产生垃圾。对我来说,JSON字符串在馈送JSON.stringify()一个特别大且嵌套的对象之后太长了。我希望它在控制台中看起来像一个普通的字符串对象。因此,我再次对其进行了解析:

JSON.parse(JSON.stringify(largeObject))

在那里。如果您有更简单的方法,请告诉我。

答案 5 :(得分:0)

自Nodejs v11.5.0起,您可以在getters: true选项中设置util.inspectSee here for docs

  

获取器 | 如果设置为true,则将检查吸气剂。如果设置为“ get”,则仅检查没有相应设置器的获取器。如果设置为“ set”,则仅检查具有相应setter的吸气剂。这可能会导致副作用,具体取决于吸气剂功能。默认值:false。