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"
有两种类型的导入语句。尖括号表示框架代码,而引号表示本地项目代码。导入框架代码时,会使用内置的搜索路径机制从定义的位置中搜索目标文件。而导入本地代码时,则只会查找与导入文件相关的位置。
Objective-J简明教程3-1:类、方法
2009年05月26日 Web开发, 翻译
官方网站原文:Learning Objective-J
![]()
Objective-J是一门基于Objective-C的新编程语言,是JavaScript的超集。换句话说,任何有效的JavaScript代码同样也是有效的Objective-J代码。对于熟悉JavaScript及面向对象编程概念,特别是熟悉经典继承机制的读者而言,学习Objective-J并不难。熟悉Objective-C会有所帮助,但不是必需的。
类
Objective-J有两种对象:本地JavaScript(以下简称“JS”)对象和Objective-J对象。本地JS对象就是JavaScript内置的那些对象。Objective-J对象则是Objective-J添加的另一种本地对象。这些新增的对象基于类和经典继承构建(与C++或Java相似),而不是基于原型式继承构建。
在Objective-J中创建一个类很简单。下面就是一个Person类的代码,该类包含一个成员变量name:
- @implementation Person : CPObject
- {
- CPString name;
- }
- @end
类定义始终以关键字@implementation开头,后跟类名。冒号后面的第三个项是要子类化的类。在这个例子中,我们想要子类化CPObject,而它是大多数类的顶级(root)类。你可能不需要超类,但终归还应该有一个比较稳妥(You don’t need a superclass, but nearly all the time you will want one.)。
在类声明之后,包含在一对花括号中的代码块,用于定义类的成员变量。每个变量声明独占一行,格式是类型、变量名和一个分号。从技术上角度讲,类型是可选的,但我们强烈建议不要省略它。声明变量的类型非常重要,如果不在类中声明成员变量的类型,该变量就会变成全局变量。
类定义的最后,需要添加一个@end关键字。
方法
跟对象一样,本地JavaScript函数在Objective-J中也没有什么不同。除了本地函数之外,Objective-J则为新的类系统添加了方法的概念。下面我们就为Person类添加一组访问器(accessor)方法:
- - (void)setName:(CPString)aName
- {
- name = aName;
- }
- - (CPString)name
- {
- return name;
- }
以上这些代码位于定义类的@implementation行及声明实例变量的代码块之后、@end关键字之前。熟悉C语言(包括JavaScript)编程风格的读者对这种语法应该不会陌生。这里唯一需要说明的就是方法声明。
每个方法签名以一个减号(-)或一个加号(+)开头。短划线表示实例方法,即能够基于实例变量调用的方法。由此可见,上面的两个方法都应该是实例方法,因为这两个方法的用途分别是设置和取得Person对象的实例变量。
减号/加号的后面是由一对圆括号包围的类型。这也没有什么特别的。同样,这里的类型声明虽然也是可选的,但我们仍然要强烈推荐,因为它有助于理解代码。最后,就是方法名。在Objective-J中,方法的参数与方法名是掺混在一块的。上面定义的两个方法分别是name和setName:,注意“setName”之后的冒号,这表明后面是一个参数。
如果某个方法有多个参数,则以冒号分隔每个参数。在下面的方法声明中,两个参数由一个标签(label)分隔,之后是冒号、类型和参数名:
- - (void)setJobTitle:(CPString)aJobTitle company:(CPString)aCompany
在Objective-J中,方法名可以被其参数分隔开来。从技术上说,被分隔开的方法名并不命名参数;即上面的方法名是setJobTitle:company:。把方法名的第一部分与后续的标签按照次序连接起来,就是“实际的”方法名。
方法的参数必须按顺序传递,而且必须传递所有参数。例如,要调用上面定义的多参数方法,需要在每个标签后面传递数据:
- [myPerson setJobTitle:"Founder" company:"280 North"];
这里,我们在每个冒号后面都指定了与参数名对应的输入值。对每个参数来说,都要重复“标签、冒号、输入”的格式。
有读者可能会问:实际的方法名是什么还有那么重要吗?在Objective-J和Cappuccino中,读者可以发现一种模式,即能够将方法作为参数传递给另一个方法。这种思想常见于委托和事件系统中。但是,由于Objective-J的方法不像JavaScript中那样是一类对象,因此引用它们需要使用特殊的表示法——@selector。如果想把前面的方法作为参数传递给另一个方法,可以使用下面的代码:
- [fooObject setCallbackSelector:@selector(setJobTitle:company:)];
由此可知,通过@selector引用(并传递)的方法名需要包含冒号及相应的参数标签。
2006年以来翻译的英文外版图书回顾
2009年05月18日 翻译
19.2009-05-18~2009-06-18
原版书名:Learning jQuery 1.3
出 版 社:人民邮电出版社
出版日期:未知
18.2009-03-21~2009-05-15
原版书名:Designing Web Interfaces: Principles and Patterns for Rich Interactions
出 版 社:电子工业出版社
出版日期:2009-8-1
17.2009-02-01~2009-03-20
原版书名:Flex 3 in Action
出 版 社:清华大学出版社
出版日期:预计2009-9-1
16.2008-09-15~2008-12-15
原版书名:Dojo: The Definitive Guide
出 版 社:机械工业出版社
出版日期:2009-4-1
15.2008-06-10~2008-07-30
原版书名:Google Web Toolkit Solutions: More Cool & Useful Stuff
出 版 社:机械工业出版社
出版日期:2009-1-1
14.2008-04-01~2008-06-01
原版书名:Google Web Toolkit Applications
出 版 社:机械工业出版社
出版日期:2008-9-1
13.2008-02-01~2008-03-30
原版书名:Stylin’ with CSS: A Designer’s Guide (2nd Edition)
出 版 社:人民邮电出版社
出版日期:2009-2-1
12.2008-01-12~2008-01-31
原版书名:Learning jQuery: Better Interaction Design and Web Development with Simple JavaScript Techniques
出 版 社:人民邮电出版社
出版日期:2008-7-1
11.2008-01-01~2008-01-12
原版书名:CSS Web Site Design Hands on Training (Hands-On Training)
出 版 社:机械工业出版社
出版日期:2008-4-1
10.2007-12-01~2007-12-31
原版书名:The Book of JavaScript, 2nd Edition: A Practical Guide to Interactive Web Pages)
出 版 社:清华大学出版社
出版日期:2008-9-1
9.2007-10-23~2007-11-30
原版书名:AdvancED DOM Scripting: Dynamic Web Design Techniques
出 版 社:人民邮电出版社
出版日期:2008-7-1
8.2007-09-01~2007-10-22
原版书名:Ajax Construction Kit: Building Plug-and-Play Ajax Applications
出 版 社:机械工业出版社
出版日期:2008-1-1
7.2007-06-13~2007-07-14
原版书名:Beginning Regular Expressions
出 版 社:清华大学出版社
出版日期:2008-10-1
6.2007-04-02~2006-06-05
《Adobe Photoshop Lightroom摄影师完全手册》
原版书名:The Adobe Photoshop Lightroom Book: The Complete Guide for Photographers
出 版 社:清华大学出版社
出版日期:2009-2-1
5.2007-02-06~2007-05-29
原版书名:PHP Cookbook,2nd Edition
出 版 社:中国电力出版社
出版日期:预计2009-10-1
4.2006-09-13~2006-11-30
原版书名:Cascading Style Sheets: The Definitive Guide, 2nd Edition
出 版 社:学习翻译,未公开
3.2006-09-13~2006-09-30
原版书名:Sams Teach Yourself Regular Expressions in 10 Minutes
出 版 社:学习翻译,未公开
2.2006-09-01~2009- 09-12
原版文章:From DHTML To DOMScripting
出 版 社:学习翻译,未公开
1.2006-05-28~2006-08-20
原版书名:Stylin’ with CSS: A Designer’s Guide (1nd Edition)
出 版 社:学习翻译,未公开


















本博客专注于Web前后端技术和技术翻译。目前正在翻译《JavaScript高级程序设计(第2版)》。新浪微博(t.sina.com.cn/lisf),Twitter(@cncuckoo,仅仅用于跟踪国外牛人;我翻不了墙,无法接受各位朋友的follow,抱歉!)