我知道Sun公司曾经对Self进行过一些研究 - 是否有其他关于原型式面向对象编程的知识来源?最好是自学可得的。
我找到了一本包含论文的书:《基于原型的编程:概念、语言和应用》。
有人读过这本书吗?
--
所以我为给我提供最多答案的那个人提供了赏金。尽管如此,我仍然不是很满意。我希望能听到更多技术方面的回答。也许我没有表达清楚。
--
所以我为给我提供最多答案的那个人提供了赏金。尽管如此,我仍然不是很满意。我希望能听到更多技术方面的回答。也许我没有表达清楚。
通过使用所有主要js库中可用的更新/合并函数,可以轻松地对整个对象执行此操作。不是“真正”的交换,但它可能很有用。 - Karl Guertinrest_save = function(){return "REST"} sql_save = function(){return "SQL"} Storage = function(){/初始化等/} Storage.prototype.save = rest_save my_obj = new Storage() my_obj.save() "REST" Storage.prototype.save = sql_save function() my_obj.save() "SQL"
如果你正在寻找有人指出每种编程方式的优缺点,并以此解释它们流行的原因,我认为你犯了一个谬误,这种谬误在技术领域非常普遍,即流行度与某种绝对质量标准有关。
事实上,真相要平淡得多 - 基于类的面向对象编程之所以流行,是因为Java使用经典的面向对象编程方式,Sun花费了数百万美元和很长时间来建立Java的流行度 - 确保人们知道它在企业中得到成功应用,在大学广泛教授,并且出现在高中AP测试中。
原型/经典面向对象编程只是组织思想的不同方式。您可以在不支持其本地实现的语言中实现任何一种(例如Python和Java,另外还有JavaScript)。
在传统面向对象编程中,你需要为你的对象定义一个抽象的类层次结构,然后实际上是通过这些类的实例来进行工作。而在原型继承中,则是创建了一个对象实例层次结构。虽然我想这在两个派别中都可能有点异端,但我认为你可以将两者混合使用...这个问题引起了我的兴趣,于是我回去阅读了一些关于这个概念的原始论文。看起来这个概念在20世纪80年代中期开始流行于Smalltalk世界,但最终成为Self的创始原则之一。更晚期,Javascript也采用了它。
论文中提出的观点是,原型编程更容易学习。除了学习外,实际上没有提出其他技术益处。所有论文都解释了它和基于类的语言一样表达能力强,但更容易学习。人们天然地以具体方式思考事物而不是抽象的。我们想到的是动物园里看到的大象,而不是一个普通的“大象”。当我们看到其他大象时,我们将它们归类为与第一个大象的差异。原型编程语言促进了这种思考方式。将其视为差分编程。
这是使用它作为语言的充分理由吗?也许。自从这个想法首次开始发酵以来的25年里,我认为像基于类的OO这样的抽象概念并不难学习。另一方面,也许有需要一种更容易使用的蓝领编程语言(如Javascript),这可能是实现这一目标的方式。
如果感兴趣,你可以从这篇关于self的论文开始了解。
我不知道确切的原因,但是以下是我的理由:
我认为这个争论与动态和静态的区别相同,类是对象的静态定义,可以轻松地知道从对象中期望什么,它还帮助语言工具具有适当的智能感支持和文档,因为您可以轻松知道对象中的不同成员和方法,另一个是具有在类中声明私有成员的不同范例,这在原型范例中无法实现。
原型范例不错,但缺乏提供关于对象中方法和成员的信息的能力,这使得工具更难以使用,并且对于动态类型编程更有意义。