【发布时间】:2018-02-03 00:38:00
【问题描述】:
我正试图围绕对象链接其他对象来编写节点模块。这是我目前所拥有的(灵感来自this answer):
'use strict'
// Composable prototype object
var parent = {
publicVar: 1,
doSomething() {
return externalMethod(this.publicVar) + 10
}
}
// Composable prototype object
var child = {
doSomethingChild() {
return this.publicVar + 20
}
}
// an external method
function externalMethod(arg) {
return arg
}
// the parent factory
function Parent() {
let privateVar = 2
return Object.assign({
getPrivate() {
return privateVar
}
}, parent)
}
// the child factory
function Child() {
let privateVar = 4
let parent = Parent() // call to the Parent factory
return Object.assign(parent, child, {
getPrivateChild() {
return privateVar
}
})
}
// Node export
module.exports = {
Parent: Parent(),
Child: Child()
}
稍后,我将需要这样的模块:
Parent = require('./my-module').Parent
Child = require('./my-module').Child
Parent.getPrivate() // 2
Parent.doSomething() // 11
Child.getPrivateChild() // 4
Child.doSomethingChild() // 21
恐怕使用 OLOO 可能会有更优雅的方式来做到这一点。我主要担心的是我认为我应该在 Child 工厂做let parent = Object.create(Parent),但如果我这样做它就行不通。
那么,1)我错过了什么,2)可以重构吗?
【问题讨论】:
-
我不确定链接的答案是否是一个应该遵循的好例子。它声称它确实“组合而不是继承”,但实际上它只是混合模式。考虑到我们有类,这在 ES6 中看起来很残缺。您是否有尝试以这种方式解决的类和原型惯性问题?由于问题有
ecmascript-6标签,显而易见的答案是“不要在 ES6 中那样做”。 -
@estus 你推荐使用 ES6 类吗?有几个人对他们提出了很好的理由:Kyle Simpson,Eric Elliott。你会如何重构它?
-
对于这种情况,绝对是。两个类,两个实例,没有什么可考虑的。一旦你掌握了这两种方法并知道它们如何影响设计和性能,你就可以选择其中一种——但大多数时候你会选择课程,因为它们是有效的并且可以完成工作。我觉得 YDKJS 系列很有启发性,但也有不合理的固执己见。上述章节抨击原型,虽然它们对 JS 来说是惯用的,并且可能是 perform betterIRL。
-
你真的不应该导出
Parent()和Child()实例,而是导出Parent和Child函数本身。 -
@nachocab 如果你导出实例,它们就会变成单例,而你所有复杂的工厂东西都可以被一个微不足道的对象字面量替换。
标签: javascript ecmascript-6 stampit.js