gpt4 book ai didi

javascript - Node 的控制台没有显示所有对象属性...这是预期的行为吗?

转载 作者:太空宇宙 更新时间:2023-11-03 21:50:41 28 4
gpt4 key购买 nike

我做了

  console.log(myURL);

并且没有看到扩展属性

  console.log(myURL.extension);

但是如果我自己登录它,它会正确显示该值。

found 是一个 URL 对象,如下创建:

  const url = require('url');
let myURL = new URL(test);

缺失的属性是这样添加的:

  myURL.extension = test.split('.').pop();

输出如下所示:

URL {
href: 'https://www.imdb.com/favicon.ico',
origin: 'https://www.imdb.com',
protocol: 'https:',
username: '',
password: '',
host: 'www.imdb.com',
hostname: 'www.imdb.com',
port: '',
pathname: '/favicon.ico',
search: '',
searchParams: URLSearchParams {},
hash: ''
}

示例代码:

const url = require('url');
const test = 'https://www.imdb.com/favicon.ico';
let myURL = new URL(test);
myURL.extension = test.split('.').pop();
console.log(myURL);

最佳答案

出现此行为的原因是 prototype URL 定义了 util.inspect.custom 覆盖。例如,在 Node.js v12.11.0 中,它的定义如下:

> console.log(myURL[util.inspect.custom])

[inspect.custom](depth, opts) {
if (this == null ||
Object.getPrototypeOf(this[context]) !== URLContext.prototype) {
throw new ERR_INVALID_THIS('URL');
}

if (typeof depth === 'number' && depth < 0)
return this;

const ctor = getConstructorOf(this);

const obj = Object.create({
constructor: ctor === null ? URL : ctor
});

obj.href = this.href;
obj.origin = this.origin;
obj.protocol = this.protocol;
obj.username = this.username;
obj.password = this.password;
obj.host = this.host;
obj.hostname = this.hostname;
obj.port = this.port;
obj.pathname = this.pathname;
obj.search = this.search;
obj.searchParams = this.searchParams;
obj.hash = this.hash;

if (opts.showHidden) {
obj.cannotBeBase = this[cannotBeBase];
obj.special = this[special];
obj[context] = this[context];
}

return inspect(obj, opts);
}

您可以覆盖此行为并添加 extension属性作为URL的 setter/getter 类(class)prototype如果您真的关心输出格式:

const { URL } = require('url');
const { inspect } = require('util');

Object.defineProperty(URL.prototype, 'extension', {
enumerable: true,
configurable: true,
get() { return this.pathname.split('.').pop(); }
});

URL.prototype[inspect.custom] = function(depth, opts) {
if (typeof depth === 'number' && depth < 0) return this;

const keys = Object.keys(URL.prototype).filter(key => typeof this[key] !== 'function');
const obj = Object.create({ constructor: URL });
Object.assign(obj, ...keys.map(key => ({ [key]: this[key] })));
return inspect(obj, opts);
};

然后你的输出格式将如下所示:

> new URL('https://www.imdb.com/favicon.ico')
URL {
href: 'https://www.imdb.com/favicon.ico',
origin: 'https://www.imdb.com',
protocol: 'https:',
username: '',
password: '',
host: 'www.imdb.com',
hostname: 'www.imdb.com',
port: '',
pathname: '/favicon.ico',
search: '',
searchParams: URLSearchParams {},
hash: '',
extension: 'ico'
}

但是,如果您不太关心,那么您可以接受您看到的输出格式是预期的行为,并且您可以访问 extension属性就像您通常对任何其他对象所做的那样。

关于javascript - Node 的控制台没有显示所有对象属性...这是预期的行为吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59347988/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com