类和原型
Self 和 Smalltalk 之间最明显的区别是 Self 没有Classes的概念。对象和类之间不存在“<em>is an instance of”关系。Self 是最早的原型面向对象语言之一,在这方面是 JavaScript 的先驱。因此,在 Smalltalk 中创建新对象的典型方法是实例化,而在 Self 中则是克隆。
执行和消息
正如您已经发现的那样,第二个根本区别在于,在 Self 中,执行的唯一概念是消息发送,而在 Smalltalk 中,也存在赋值和对象字段访问。此外, Self中没有全局状态之类的东西。您只能通过发送消息访问可以检索的内容。然而,Self 跟踪一些“众所周知的对象”,可以给出一个新创建的对象。
状态和插槽
对前面两点“没有类”和“只有消息”的思考清楚地表明,Smalltalk 和对象状态之间的区别及其行为 并不直接存在于 Self 中。Smalltalk 将状态存储在对象的实例变量中,并将行为存储在其类的方法字典中,Self 使用槽的概念,它可以表示状态和行为。
分享行为
为了帮助组织行为,Self 不仅提供原型,还提供特征。特征是仅包含行为的对象,并且多个对象共享。(此外,还有mixins ,行为和状态的一小部分,可以组合成其他对象)。
Self 中的对象可以有父对象,向其发送对象本身不理解的消息(委托)。这会创建类似于 Smalltalk 中的类继承的层次结构,但不需要类。
几个例子
创建一个新对象
短暂聊天
Object new
自己:
- 一个普通的对象:
()
或(||)
(明确没有插槽)
- 复制的对象:
someObject copy
创建一个包含一些字段的对象
短暂聊天
Object subclass: #MyObjects instanceVariableNames: 'foo bar'. "…"
MyObject new.
自己
( | foo. bar | )
制作收藏
短暂聊天
OrderedCollection new.
自己
list copy.
“继承”</h3> Smalltalk
Object subclass: #MyObject. "…"
自己
( | parent* <- list | )
资源
我建议阅读Self 网页上的参考书目部分。