JavaScript原型链接使用'self'简单处理

时间:2012-05-07 21:32:12

标签: javascript inheritance coffeescript prototype

我开始喜欢以下模式(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放入原型中,以便引用这些函数而不是复制它们?

那时有人可以启发我吗?

1 个答案:

答案 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类时,构造函数永远不会返回任何内容,允许您处理这个奇怪的问题。