问题来自语言设计的角度。
我应该解释一下情况。我正在研究一个不支持原型的javascript变种,但是它已经过期了一个体面的类型系统(最重要的是支持instanceof)。 ecmascript规范并不重要,因此我可以自由地实现不同且更适合的东西。
在变体中: -
function foo()
声明构造函数,而是在模板文件中声明构造函数,这意味着构造函数存在于命名空间中(由文件路径决定)从未成为网络开发人员,这使我处于从未在愤怒中使用原型的稍微离奇的位置。虽然这并没有阻止我对他们有意见。
我理解它的原型模型的主要问题是
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,因为有很多我想说的,但它的重要决定和专家意见可能是非常宝贵的。
谢谢,
麦克
编辑提案希望现在有意义。
答案 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/
请记住,那些未能学习历史的人注定要重新实现它。