我开始喜欢下面的模式(抱歉,这里是 Coffeescript,因为在这种情况下它更具可读性):
Parent = (proto)->
self = Object.create proto
public1 = ->
console.log "in public1 with self: ", self
console.log "in public1 with name: ", self.name
self.public1 = public1
self
Child = (proto)->
self = new Parent proto
private1 = ->
console.log "in private1 with self: ", self
console.log "in private1 with name: ", self.name
self.public1()
public2 = ->
console.log "in public2 with self: ", self
console.log "in public2 with name: ", self.name
private1()
self.public2 = public2
self
GrandChild = (proto)->
self = new Child proto
public3 = ->
console.log "in public3 with self", self
console.log "in public3 with name: ", self.name
self.public2()
self.public3 = public3
self
felix = new GrandChild name: "Felix"
felix.public2()
多重继承的这种天真的尝试有效,并且可以简单且明显方便地使用“自我”……当您像我一样来自其他 oop 语言时,这很聪明。
陷阱:每个 GrandChild 对象都会创建一个 NEW Child 以及一个 NEW Parent 对象,因此如果创建了许多 GrandChild 对象,内存消耗就会增加。
据我所知,用 Child 和 Parent 的方法增强 GrandChild 的原型只会在 GrandChild 对象中引用他们的方法(并节省大量空间),但是向上和向下阅读我找不到像我一样访问 self 的方法与上层解决方案。
我知道 Coffeescript 本身在 JS 的原型继承之上提供了一个基于类的继承系统。其他库也提供解决方案。我想简单地了解如何根据用例选择正确的解决方案。
如果 - 例如 - 我想将 Child 的 private1 和 public2 放入原型中,以便引用而不是复制这些函数怎么办?
那时有人可以启发我吗?