官方网站原文: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"

有两种类型的导入语句。尖括号表示框架代码,而引号表示本地项目代码。导入框架代码时,会使用内置的搜索路径机制从定义的位置中搜索目标文件。而导入本地代码时,则只会查找与导入文件相关的位置。

相关内容

Objective-J简明教程3-1:类、方法
Objective-J简明教程3-3:内存管理、类目、作用域