如何扩展Node.js url模块的URL类以添加自定义属性?
解决扩展URL类时自定义属性不显示的问题
嘿,我来帮你捋清楚这个问题!你的代码其实已经成功给MyURL实例添加了base属性,只是控制台打印URL实例的时候,默认只会展示它的标准URL相关属性,所以自定义的base没在那个缩写输出里显示出来。你可以马上验证一下:在代码末尾加一行console.log(ur.base),肯定能输出http://www.example.com/about。
为什么会出现这种情况?
这是因为Node.js里的URL类实例被特殊处理了——当你用console.log打印它时,会调用内部的格式化逻辑,只输出它固有的URL属性(比如href、origin、protocol这些),并不会主动展示你自定义添加的属性,但这些属性确实存在于实例上。
如果想让自定义属性在打印实例时显示出来
如果你希望打印MyURL实例时能同时看到base属性,可以重写Node.js的自定义检查方法Symbol.for('nodejs.util.inspect.custom'),把标准属性和自定义属性合并后输出:
let { URL } = require('url'); class MyURL extends URL { constructor(url, base) { super(url, base); this.base = base; } // 重写自定义检查方法,让控制台打印时包含base属性 [Symbol.for('nodejs.util.inspect.custom')]() { // 提取URL的标准属性(排除方法) const standardProps = {}; for (const prop of Object.getOwnPropertyNames(URL.prototype)) { const value = this[prop]; if (typeof value !== 'function') { standardProps[prop] = value; } } // 合并标准属性和自定义属性 return { ...standardProps, base: this.base }; } } let ur = new MyURL('abc.html','http://www.example.com/about') console.log(ur); // 现在打印结果会包含base属性了
这样修改后,控制台打印的MyURL实例就会同时展示所有标准URL属性和你的自定义base属性啦~
内容的提问来源于stack exchange,提问作者vibhor1997a
相关产品推荐
相关产品推荐

