2

这个问题是从语言设计的角度来看的。

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

在变体中:-

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

从来没有做过网络开发人员,这让我处于一个有点奇怪的位置,从来没有在愤怒中使用过原型。尽管这并没有阻止我对他们发表意见。

据我了解,我对原型模型的主要问题是

  • 对象命名空间、obj.prototype、obj.constructor 不必要的乱扔垃圾(这是一个不成熟的反对意见,试图保留将对象视为映射的能力,也许它们不是?)
  • 在运行时更改共享行为的能力似乎没有必要,因为直接使用额外的间接级别会更直接obj.shared.foo()。特别是它是一个相当大的实现头痛
  • 人们似乎不太了解原型,例如原型和构造函数之间的区别。

所以为了解决这些问题,我的想法是有一个特殊的 operator constructorsof。基本上,原则是每个对象都有一个构造函数列表,有时您会想要访问这些构造函数。

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

4 回答 4

4

Steve Yegge 写了一篇关于原型模型的优秀技术文章。

于 2009-03-09T03:54:30.867 回答
2

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

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

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

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

使用对象作为映射没有问题,只要键是字符串并且您检查hasOwnProperty().

  • 在运行时更改共享行为的能力似乎没有必要,当直接使用额外的间接级别时,obj.shared.foo() 会更直接。特别是它是一个相当大的实现头痛

我看不出在实现原型链时最令人头疼的地方在哪里。事实上,我认为原型继承在概念上比基于类的继承更简单,后者在具有后期绑定的语言中没有任何好处。

  • 人们似乎不太了解原型,例如原型和构造函数之间的区别。

只懂Java、C++等基于类的oo语言的人,不懂JavaScript的继承系统,11点新闻。

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

于 2009-03-09T12:38:41.353 回答
0

使用实用的代码尝试一些事情可能会更容易。用一种简单的语法创建语言,不管是什么,然后用那种语言实现一些东西。然后,经过几次重构迭代后,找出阻碍阅读和编写代码的特性。添加、更改或删除改进语言所需的内容。这样做几次。

确保你的测试代码真正练习了你语言的所有部分,即使有一些真的试图破坏它。尝试在测试中做错所有事情(以及做对所有事情)

于 2009-03-09T03:59:30.230 回答
0

阅读开创原型模型的语言“self”可能会帮助您,而不仅仅是从 javascript 的角度来思考它(特别是因为您似乎将它与“Web 编程”联系起来,正如许多人所做的那样)。一些帮助您入门的链接:

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

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

于 2009-03-09T04:43:05.930 回答