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

sg3maiej  于 2022-12-25  发布在  Java
关注(0)|答案(7)|浏览(164)

在此代码中:

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:[获取程序/设置程序]}
是否有办法让console.log函数使用getter值?

5lwkijsr

5lwkijsr1#

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

6ovsh4lw

6ovsh4lw2#

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

9o685dep

9o685dep3#

从Nodejs v11.5.0开始,你可以在util.inspect选项中设置getters: true
吸气剂|如果设置为true,则检查getter。如果设置为“get”,则仅检查没有相应setter的getter。如果设置为“set”,则仅检查具有相应setter的getter。这可能会导致副作用,具体取决于getter函数。默认值:错。

pgpifvop

pgpifvop4#

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

jckbn6z75#

我需要一个没有getter和setter的漂亮的打印对象,但是普通的JSON产生了垃圾。对我来说,在给JSON.stringify()一个特别大的嵌套对象之后,JSON字符串太长了。我希望它看起来和行为都像控制台中的普通字符串化对象。所以我再次解析了它:

JSON.parse(JSON.stringify(largeObject))

好了。如果你有更简单的方法,告诉我。

58wvjzkj

58wvjzkj6#

在Node.js上,我建议使用util.inspect.custom,这将允许您将getter漂亮地打印为值,同时保持其他属性输出不变。
它将只应用于您的特定对象,并且不会扰乱常规console.log输出。
相对于Object.assign的主要好处是它发生在你的对象上,所以你可以保留常规的通用console.log(object)语法,而不必用console.log(Object.assign({}, object)) Package 它。
将以下方法添加到对象中:

[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
p4tfgftt

p4tfgftt7#

使用展开运算符:

console.log({ ... obj });

相关问题