Я сделал

console.log(myURL); 

и не видел свойство extension

  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 это определяется так:

 {amp}gt; 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' {amp}amp;{amp}amp; depth {amp}lt; 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 в качестве получателя к prototype класса URL , если вы действительно заботитесь о формате вывода:

 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' {amp}amp;{amp}amp; depth {amp}lt; 0) return this; const keys = Object.keys(URL.prototype).filter(key ={amp}gt; typeof this[key] !== 'function'); const obj = Object.create({ constructor: URL }); Object.assign(obj, ...keys.map(key ={amp}gt; ({ [key]: this[key] }))); return inspect(obj, opts); }; 

и тогда ваш выходной формат будет выглядеть так:

 {amp}gt; 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 же, как обычно для любого другого объекта.