为什么Object.assign不会复制URL对象的属性?

9
在 macOS 10.13.1 上使用 Chrome 63。
我正在使用 Object.assign,将 new URL() 作为源对象,但它总是返回一个空对象?这似乎是奇怪的行为。以下是我的代码:
 let url = new URL('http://www.yahoo.com');
 console.log(url);
 let data = Object.assign({}, url);
 console.log(data);

为什么数据是一个空对象,而url则具有完整的URL对象,如下所示:
{
 href: "http://www.yahoo.com/", 
 origin: "http://www.yahoo.com", 
 protocol: "http:", 
 username: "", 
 password: ""
 ...
}

我也尝试了:

let data = Object.assign({}, ...url);  

但是它给出了以下错误信息:

未捕获的类型错误:undefined不是函数


3
你看过这个函数的文档了吗?它用于复制所有可枚举自身属性的值。 - Patrick Evans
是的。我刚刚查了一下,发现了它的含义。现在我的问题是如何复制该属性呢? - xkeshav
你想从 URL 实例中获取哪些具体属性? - guest271314
你需要循环遍历每个属性(例如 for...in),因为所有的属性实际上都是基于某些内部变量的 getter/setter。 - Patrick Evans
除了searchParams之外的所有属性我都需要。 - xkeshav
2个回答

7
我怀疑这是因为URL的属性不可枚举。注意当你使用Object.keys(url)时,也会得到一个空数组?Object.assignObject.keys都使用可枚举属性。你url对象上的属性并非可枚举。

是的。我已经检查过 url.propertyIsEnumerable('href'),它返回了 false。那么如何复制这个对象呢? - xkeshav
@pro.mean 你可以使用 for in 循环来遍历属性。 - Brian Glaz
哦,只用基本的方法?没有任何ES6的方法吗? - xkeshav
@pro.mean Object.getOwnPropertyDescriptors() - Jared Smith
@JaredSmith Reflect 没有那个方法。 - guest271314
@guest271314 是的,我刚意识到,不知道为什么他们从 Object 复制了每个静态方法,除了那个... Reflect 确实有 .getOwnPropertyDescriptor - Jared Smith

2

您可以简单地通过克隆URL来实现:

 let url = new URL('http://www.yahoo.com');
 console.log(url);
 let data = new URL(url);
 console.log(data);

URL语法:

url = new URL(url, [base])

您仍然可以使用现有的URL对象作为基础,该对象将自身字符串化为对象的href属性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接