在javascript中可以从原型模型中学到什么?

时间:2009-03-09 03:30:19

标签: javascript prototype language-design

问题来自语言设计的角度。

我应该解释一下情况。我正在研究一个不支持原型的javascript变种,但是它已经过期了一个体面的类型系统(最重要的是支持instanceof)。 ecmascript规范并不重要,因此我可以自由地实现不同且更适合的东西。

在变体中: -

  • 您没有使用function foo()声明构造函数,而是在模板文件中声明构造函数,这意味着构造函数存在于命名空间中(由文件路径决定)
  • 目前,所有行为的继承都是通过应用模板来完成的,这意味着所有共享函数都被复制到每个单独的对象(事后没有原型)。

从未成为网络开发人员,这使我处于从未在愤怒中使用原型的稍微离奇的位置。虽然这并没有阻止我对他们有意见。

我理解它的原型模型的主要问题是

  • 对象命名空间,obj.prototype,obj.constructor的不必要的乱抛垃圾(这是一个不成熟的异议,试图保留将对象视为地图的能力,也许它们不是?)
  • 在运行时更改共享行为的能力似乎是不必要的,当直接使用额外的间接级别时会更直接obj.shared.foo()。特别是这是一个非常大的实施难题
  • 人们似乎并不能很好地理解原型,例如:原型和构造函数之间的区别。

因此,为了解决这些问题,我的想法是拥有一个特殊的运算符构造函数。基本上,主体是每个对象都有一个构造函数列表,有时你会想要访问它。

var x = new com.acme.X();
com.acme.Y(x,[]);      // apply y

(constructorsof x) // [com.acme.Y,com.acme.X,Object];

x instanceof com.acme.X;   // true
x instanceof com.acme.Y;   // true

所有的反馈意见都表示赞赏,我很欣赏我可能很难欣赏我的POV,因为有很多我想说的,但它的重要决定和专家意见可能是非常宝贵的。

  • 任何可以提高我对原型模型,好的和坏的理解的东西。
  • 对我的提案的想法

谢谢,

麦克

编辑提案希望现在有意义。

4 个答案:

答案 0 :(得分:4)

Steve Yegge写了一篇关于prototype model的好文章。

答案 1 :(得分:2)

我不认为您对原型模型的问题是有效的:

  
      
  • 对象名称空间,obj.prototype,obj.constructor
  • 的不必要乱扔垃圾   

prototype是构造函数的属性,而不是对象实例。此外,问题并没有听起来那么糟糕,因为[[DontEnum]]属性,遗憾的是无法以编程方式设置。如果可以的话,一些感知到的问题就会消失。

  

这是一个不成熟的反对意见,试图保留将对象视为地图的能力,这可能不是吗?

将对象用作地图没有问题,只要这些键是字符串并且您检查hasOwnProperty()

  
      
  • 在运行时更改共享行为的能力似乎是不必要的,当直接使用额外的间接级别时,更直接的是obj.shared.foo()。特别是这是一个非常大的实施难题
  •   

我没有看到实现原型链的重大实施问题在哪里。事实上,我认为原型继承在概念上比基于类的继承更简单,后者在后期绑定的语言中没有任何好处。

  
      
  • 人们似乎并不能很好地理解原型,例如:原型和构造函数之间的区别。
  •   

只知道基于类的oo语言(如Java和C ++)的人不了解JavaScript的继承系统,新闻是11。

除了MarkusQ的建议外,您可能还想查看Io

答案 2 :(得分:0)

使用实用代码尝试一些事情可能更容易。使用一种简单的语法创建语言,无论是什么,并使用该语言实现某些东西。然后,在几次重构迭代之后,确定读取和编写代码的障碍特征。添加,更改或删除改进语言所需的内容。这样做几次。

确保您的测试代码真正运用您的语言的所有部分,即使有一些真正试图打破它。尝试在测试中做错(以及一切正确)

答案 3 :(得分:0)

阅读“自我”这一开创原型模型的语言,可能会帮助你而不仅仅是用javascript来思考它(特别是因为你似乎把它与“网络编程”联系在一起) )。一些可以帮助您入门的链接:

http://selflanguage.org/
http://www.self-support.com/

请记住,那些未能学习历史的人注定要重新实现它。