我开始喜欢以下模式(sry,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语言时,能够简单明了地使用'self'... smart。
Gotcha:每个GrandChild对象都会创建一个NEW Child和一个NEW Parent对象,以便在创建许多GrandChild对象时增加内存消耗。
使用Child和Parent的方法扩充GrandChild的原型只会在我理解的范围内引用他们在GrandChild对象中的方法(并节省大量空间),但是上下阅读我找不到访问自己的方法我对上层解决方案的态度。
我知道Coffeescript本身在JS的原型继承之上提供了一个基于类的继承系统。其他lib也提供解决方案。我想简单地了解一下根据用例选择正确的解决方案。
如果 - 例如 - 我想将Child的private1和public2放入原型中,以便引用这些函数而不是复制它们?
那时有人可以启发我吗?
答案 0 :(得分:1)
Gotcha:每个GrandChild对象都会创建一个新孩子以及一个新孩子 父对象,以便在很多情况下增加内存消耗 创建了GrandChild对象。
假。你在new GrandChild
时所做的就是你在Parent
实例化然后用Child
构造函数中的方法装饰它,然后再从GrandChild
装饰它构造函数。它是同一个对象,从Object.create proto
一直到孙子。在这方面,你根本不会乱用虚拟对象。
使用Child's和Parent的方法扩充GrandChild的原型 只会在我的GrandChild对象中引用它们的方法 理解(并节省大量空间),但上下阅读我没有 找到一种方法来获得自我与上层的方式 溶液
基于闭包的私有方法和原型通常不会相处。当你在这样的构造函数中完成所有操作时,你可以有很大的灵活性,但是你失去了使用原型的优点(比如不在新范围内重新定义函数的速度)。
我知道Coffeescript本身提供了一个基于类的继承系统 在JS的原型继承之上。其他lib提供解决方案 好。我想简单地了解正在发生的事情 解决方案取决于用例。
确实如此,当使用咖啡脚本时,没有理由不使用它。已经有很多想法了。但是私人方法再次变得棘手。通常,私有方法只是公开,但强调前缀为Foo.prototype._privateMethod
以表示其私密性。如果这还不够好,事情开始变得时髦。
如果 - 例如 - 我想将private1和public2放入 将子项转换为原型,以便引用这些函数 复制?
公共方法可以进入原型并传播好,非私有。私有并不是一个在javascript中思考事物的好方法,因为它不像其他语言那样受支持。相反,您可以访问的任何值(包括函数)都是通过局部变量或闭包在当前作用域中,或者是通过局部变量或闭包在当前作用域中的对象上的属性。
编辑:
最后,如果没有 new
关键字,您在此处获得的模式将更好地提供。由于您正在创建并返回任意对象,因此您不需要JS引擎为您创建一个。因此,如果您只是完全从代码中移除new
,那么您的代码应该可以正常工作。
构造函数有一个怪癖。当他们返回一个对象时,他们返回该对象而不是通过new
创建的对象。在这里,您将通过self
返回Object.create
。如果构造函数返回非对象(字符串,数字,函数,null),它实际上将返回this
。在咖啡脚本中,由于函数的隐式返回,这可能很棘手。当使用coffeescript类时,构造函数永远不会返回任何内容,允许您处理这个奇怪的问题。