【发布时间】:2016-05-01 16:32:34
【问题描述】:
我目前正在使用Object.create() 来构造这样的对象:
const Tab = ({id, windowId}) => Object.assign(Object.create(Tab.prototype), {id, windowId})
Tab.prototype = {
constructor: Tab,
toString: function() {
return `${this.constructor.name} ${JSON.stringify(Object.values(this))}`
}
}
其中一个目标是避免使用 new 关键字,以便我可以使用构造函数,例如,像这样:[{id: 1, windowId: 2}].map(Tab)(与使用像 String 这样的原生构造函数相同;例如,[1,2,3].map(String) 有效)。问题是必须手动定义构造函数属性并不好,所以有什么方法可以绕过它并自动设置构造函数,例如使用new 关键字,同时仍然使用Object.create()?
更新基于答案的固定版本:
const Tab = function({id, windowId}) {
return Object.assign(Object.create(Tab.prototype), {id, windowId})
}
Object.assign(Tab.prototype, {
toString: function() {
return `${this.constructor.name} ${JSON.stringify(Object.values(this))}`
}
})
【问题讨论】:
-
请注意,您将遇到的一个问题是(据我所知)箭头函数不会具有“名称”属性(或者它将是
undefined或东西)。 -
我的目标是 Chrome(扩展),它支持匿名函数的推断名称,所以它可以工作。
-
哦,好的。我猜这有点好。
-
只是出于好奇:你到底为什么要使用
Tab.prototype(而不是单独的对象文字)? -
不确定我是否理解这个问题,抱歉。我使用原型是因为它在创建的对象之间共享。
标签: javascript ecmascript-6 ecmascript-5