Objective-J简明教程3-2:使用对象和类、导入代码
2009年05月31日 Web开发, 翻译
官方网站原文:Learning Objective-J
了解了Objective-J对象和类的基本情况下,接下来我们看一看如何使用它们。下面的代码创建一个新Person对象,并设置了其name属性:
- var myPerson = [[Person alloc] init];
- [myPerson setName:"John"];
Objective-J中的方法调用叫做“消息”(messages),为对象发送消息需要使用方括号表示法,如:[object message]。如前所述,有些方法是类方法,要通过类来调用——alloc就是一个类方法。Objective-J中的每个类都有一个名叫alloc的特殊的类方法,该方法返回相应类的一个新实例。
上面的例子在Person类上调用了alloc方法,结果返回了一个Person实例。然后,我们又调用了该实例的init方法。无论alloc还是init都返回一个对象的引用,而我们把这个对象赋给了变量myPerson。就像alloc一样,每个类都会从CPObject继承init方法。
alloc类方法与JavaScript、C++及Java语言中的new关键字相似,都是创建新的实例。而init实例方法则与这些语言中的构造器相似,都是对新创建的实例执行初始化。
有一些会指定自定义的init方法,如CPView的自定义init方法签名如下:
- - (id)initWithFrame:(CGRect)aFrame
每个子类都要确保调用其父类的init方法。以下是前面Person类的自定义init方法,该方法直接接收名字参数:
- - (id)initWithName:(CPString)aName
- {
- self = [super init];
- if (self)
- {
- name = aName;
- }
- return self;
- }
首先,调用超类的init方法,结果会返回一个对新初始化实例的引用。此时,必须把这个引用赋值给self变量(以防超类的init方法因新实例而抛弃原始的实例)。然后,检查self确保其正确返回,如果检查通过则执行针对当前类的操作,即把aName赋值给name。最后,返回self以便调用代码获得这个新初始化对象的引用。
Objective-J中的self等价于JavaScript中的this。可以说this引用JavaScript对象,而self引用Objective-J对象。与JavaScript类似,self.foo引用的是foo实例变量;但与JavaScript不同的是,self不是必需的,即可以在任何实例方法中使用foo。
Cappuccino中的很多类都为创建对象提供了一种略有不同的模型,但却更加便捷。在创建对象时,这些类不调用alloc和init,而是实现各自的类方法以返回新对象。注意,在类方法中,self引用类自身。
- + (id)personWithName:(CPString)aName
- {
- return [[self alloc] initWithName:aName];
- }
可以像下面这样调用这个类方法:
- var joe = [Person personWithName:"Joe"];
导入代码
JavaScript所欠缺的一种众望所归的特性,就是以像Java或C一样的方式导入代码。对此,Objective-J添加了@import语句:
- @import <Foundation/CPObject.j>
- @import <AppKit/CPView.j>
- @import "MyClass.j"
有两种类型的导入语句。尖括号表示框架代码,而引号表示本地项目代码。导入框架代码时,会使用内置的搜索路径机制从定义的位置中搜索目标文件。而导入本地代码时,则只会查找与导入文件相关的位置。
本博客专注于Web前后端技术和技术翻译。目前正在翻译《JavaScript高级程序设计(第2版)》。新浪微博(t.sina.com.cn/lisf),Twitter(@cncuckoo,仅仅用于跟踪国外牛人;我翻不了墙,无法接受各位朋友的follow,抱歉!)
[...] Objective-J简明教程3-2:使用对象和类、导入代码 Objective-J简明教程3-3:内存管理、归类、作用域 五月 26th, 2009 in Web开发, 翻译 [...]
不好意思留下足迹,请博主见谅!
very good site!