官方网站原文:Learning Objective-J


使用对象和类

了解了Objective-J对象和类的基本情况下,接下来我们看一看如何使用它们。下面的代码创建一个新Person对象,并设置了其name属性:

  1. var myPerson = [[Person alloc] init];
  2. [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方法签名如下:

  1. - (id)initWithFrame:(CGRect)aFrame

每个子类都要确保调用其父类的init方法。以下是前面Person类的自定义init方法,该方法直接接收名字参数:

  1. - (id)initWithName:(CPString)aName
  2. {
  3.     self = [super init];
  4.     if (self)
  5.     {
  6.         name = aName;
  7.     }
  8.     return self;
  9. }

首先,调用超类的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引用类自身。

  1. + (id)personWithName:(CPString)aName
  2. {
  3.     return [[self alloc] initWithName:aName];
  4. }

可以像下面这样调用这个类方法:

  1. var joe = [Person personWithName:"Joe"];

导入代码

JavaScript所欠缺的一种众望所归的特性,就是以像Java或C一样的方式导入代码。对此,Objective-J添加了@import语句:

  1. @import <Foundation/CPObject.j>
  2. @import <AppKit/CPView.j>
  3. @import "MyClass.j"

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

相关内容

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

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

  1. @implementation Person : CPObject
  2. {
  3.     CPString name;
  4. }
  5.  
  6. @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)方法:

  1. - (void)setName:(CPString)aName
  2. {
  3.     name = aName;
  4. }
  5.  
  6. - (CPString)name
  7. {
  8.     return name;
  9. }

以上这些代码位于定义类的@implementation行及声明实例变量的代码块之后、@end关键字之前。熟悉C语言(包括JavaScript)编程风格的读者对这种语法应该不会陌生。这里唯一需要说明的就是方法声明。

每个方法签名以一个减号(-)或一个加号(+)开头。短划线表示实例方法,即能够基于实例变量调用的方法。由此可见,上面的两个方法都应该是实例方法,因为这两个方法的用途分别是设置和取得Person对象的实例变量。

减号/加号的后面是由一对圆括号包围的类型。这也没有什么特别的。同样,这里的类型声明虽然也是可选的,但我们仍然要强烈推荐,因为它有助于理解代码。最后,就是方法名。在Objective-J中,方法的参数与方法名是掺混在一块的。上面定义的两个方法分别是name和setName:,注意“setName”之后的冒号,这表明后面是一个参数。

如果某个方法有多个参数,则以冒号分隔每个参数。在下面的方法声明中,两个参数由一个标签(label)分隔,之后是冒号、类型和参数名:

  1. - (void)setJobTitle:(CPString)aJobTitle company:(CPString)aCompany

在Objective-J中,方法名可以被其参数分隔开来。从技术上说,被分隔开的方法名并不命名参数;即上面的方法名是setJobTitle:company:。把方法名的第一部分与后续的标签按照次序连接起来,就是“实际的”方法名。

方法的参数必须按顺序传递,而且必须传递所有参数。例如,要调用上面定义的多参数方法,需要在每个标签后面传递数据:

  1. [myPerson setJobTitle:"Founder" company:"280 North"];

这里,我们在每个冒号后面都指定了与参数名对应的输入值。对每个参数来说,都要重复“标签、冒号、输入”的格式。

有读者可能会问:实际的方法名是什么还有那么重要吗?在Objective-J和Cappuccino中,读者可以发现一种模式,即能够将方法作为参数传递给另一个方法。这种思想常见于委托和事件系统中。但是,由于Objective-J的方法不像JavaScript中那样是一类对象,因此引用它们需要使用特殊的表示法——@selector。如果想把前面的方法作为参数传递给另一个方法,可以使用下面的代码:

  1. [fooObject setCallbackSelector:@selector(setJobTitle:company:)];

由此可知,通过@selector引用(并传递)的方法名需要包含冒号及相应的参数标签。

相关内容

Objective-J简明教程3-2:使用对象和类、导入代码
Objective-J简明教程3-3:内存管理、类目、作用域

5月24日(上周日)跟小白到天通苑“世奥得众人从乒乓球俱乐部”打球,碰巧上午10点有一场技术讲座。老板跟我说,这次请到的是国家高级教练员王吉生老师,还说王老师的文笔不错,写过不少书。提别人我可能不知道,但王吉生老师我可不陌生。我打球以来第一次郑重其事地换球拍,就缘自看了王老师的那本《乒乓球拍探秘》。真是巧啊!因为我和小白原本都是每周六上午来打球(顺便送孩子上乒乓球课),但赶上周六小白他们公司组织春(还算不算春天啊?)游,所以才改为周日。

10点前,设在里间的会场布置好了;撤掉了3张台子。我挑了第一排的座位,一是没带眼镜,二是怕没话筒听不清。9点50左右,一位身材稍胖,年逾六旬的高个子老者走进俱乐部。他上身穿黄色半袖乒乓球衣,下身穿深蓝色运动长裤,肩挎一个大运动包,身边还跟着一位小伙子。进入会场后,距离近了,我才看清,确实是王吉生老师。不过,跟《乒乓球探秘》封底的照片相比,大约差了有10岁。

10点整,讲座正式开始。王老师开门见山,一上来就给出了讲座的主题和提纲。他说,今天主要讲一讲弧圈球,分三个方面展开,首先讲弧圈球的起源和发展变化,然后讲讲弧圈球的动作要领,最后再讲一下怎样拉出更有威力的弧圈球。以下就是我通过回忆,记录的王老师讲课的内容要点。

一、乒乓球的起源及发展变化

乒乓球由日本人发明,后来传入欧洲。欧洲人将弧圈球发扬光大,不像日本人只会正手拉,而是创造了正反手两面拉的打法。但是,第一代弧圈球打法,不能将打和拉分开,是两个动作,影响协调,不利于连续击球。到了瓦尔德内尔和佩尔森时代,才真正解决打拉结合的问题——即通过将球拍立起来,用手腕调节其前倾/后仰角度,实现打和拉的无缝结合。比如,在触球瞬间,拍形前倾,摩擦多一些,就是拉;拍形后仰,撞击多一些,就是打。

然而,纵观世界乒坛,对弧圈球(或者说乒乓球)理解最深、最到位的,还要数中国人。例如,韩国人认为乒乓球致胜的要素,一是发球接发球,二是步伐灵活(能追上球),三是发力。但只有中国人抓住了要害,即中国人把现代乒乓球致胜的要素归结为:速度、力量、旋转、落点和弧线,一共5个因素。这5个因素在实战中可以有无数种组合,都可以构成致胜要素。例如,力量小但落在了对方空档区域的球,同样可以致胜。不过,在这5个因素中,挑战人类极限的只有速度。因为人反应需要一定的时间,只有速度才能挑战人的极限,所以也就成为这5个因素中的核心。也就是说,不管什么球,无论其力量大小、旋转强弱、落点优劣、弧线高低,只要速度够快,对方没时间反应,就能致胜。

但是,外国人认为我们理解得太复杂了;或者说,他们理解不了中国人的思想。

二、弧圈球的动作要领

拉弧圈球,最重要的是协调和发力。力量当然要源自身体,但最重要的是要知道,只有以支撑腿为轴(右手就是右腿)的旋转,才是关键。通过旋转身体,带动胳膊旋转向前,然后力量再通过小臂、通过手指(直拍背后的中指,横拍背后的食指)尖,传递给球面的有效击球区域。

三、哪种弧圈球最有威力

弧圈球有3种,取决于击球点。第一种击球高点,球在对方台面弹出后,弧线同样高;第二种击球下降前期,球在对方台面弹起后,弧线低平;第三种击球下降后期,此时摩擦较多,球在对方台面弹起后,会有变速,即向下沉。

总而言之,第一种和第三种弧圈球给对方造成的困难较大,不易回接。因为,第一种球向前拱,对方不易发力;第三种球,变速后下沉,要求对方在很短时间内反应,并抢到其上升期击球。

谢谢王老师!

王老师简介

王吉生,1946年生 籍贯:浙江。 

60年代是北京乒乓球队运动员,70年代开始担任练习员以来曾先后培训出阎桂丽、魏力婕、杨燕群、赵晓云等多名世界级优秀国手和全国冠军,曾被中国乒协评为优秀教练员。 

80年代曾先后应邀担任索马里、巴基斯坦等国家乒乓球队主教练,多次获得重大国际比赛冠军。是我国第一批高级教练员。 

90年代以后,投入乒乓球器材的研制开发,先后创造了“四拓”“郗恩庭”“世奥得”等多个知名品牌。并多次在“乒乓世界”上发表文章。

Dojo中的NodeList相当于jQuery中的“jQuery对象”——即通过$()函数返回的对象列表。dojo.query方法返回NodeList,通过NodeList可以实现方法连缀。在NodeList方法不够用的情况下,要扩展NodeList也很简单:使用dojo.extend()方法为dojo.NodeList的原型添加新方法即可。在这个文件(dojo_ori.html)中,我们为NodeList添加了一个innerHTML方法,用于取得每个DOM节点包含的文本内容。

如果这种扩展代码会逐渐多起来,Dojo推荐将扩展代码保存在模块中。创建模块也非常简单——在说明创建模块的步骤之前,需要先声明一个概念,即假设示例页面(前面的dojo_ori.html)所在目录为“当前目录”——步骤是:在当前目录创建一个文件夹名叫ext-dojo(这个名字是《Dojo权威指南》中推荐的),然后把扩展代码转移到一个独立的.js文件中(假设该文件名为foo.js——名称随意,最好遵循语义化原则,让人能够对该模块的作用一目了然),把这个文件保存在ext-dojo目录下,再在其第一行添加

dojo.provide(“ext-dojo.foo”);

这样,模块文件(即foo.js)就大功告成了!

最后,怎么调用上面创建的模块并使用其中的扩展功能(方法)呢?打开这个页面(dojo.html)看一下就明白了。比较一下dojo_ori.html和dojo.html,就会发现 dojo.html包含的如下几处不同。

(1)djConfig配置项中多了baseUrl:’./’设置,顾名思义,baseUrl的作用就是设置“基准URL”,而“./”表示当前目录,意思就是让dojo.require()语句以当前目录为起点,查找要加载的模块。

(2)在调用代码中,多了如下代码:

dojo.registerModulePath(“ext-dojo”, “./ext-dojo”);
dojo.require(“ext-dojo.foo”); 

同样, dojo.registerModulePath()方法的作用也可以“顾名思义”;即,注册模块路径。通过该方法的两个参数可知,一个指定了dojo.require()语句加载模块文件使用的“限定名”,另一个则是模块文件所在的真实(相对)路径。

最后,dojo.require()方法基于前面的配置加载模块文件。不知道读者朋友注意到了没有,dojo.require()与dojo.provide()的参数是完全对应的。

19.2009-05-18~2009-06-18

《jQuery 1.3基础教程》

原版书名:Learning jQuery 1.3
出 版 社:人民邮电出版社
出版日期:未知

 

18.2009-03-21~2009-05-15

《Web界面设计》

原版书名:Designing Web Interfaces: Principles and Patterns for Rich Interactions
出 版 社:电子工业出版社
出版日期:2009-8-1

 

17.2009-02-01~2009-03-20

《Flex 3实战》

原版书名:Flex 3 in Action
出 版 社:清华大学出版社
出版日期:预计2009-9-1

 

16.2008-09-15~2008-12-15

《Dojo权威指南》

原版书名:Dojo: The Definitive Guide
出 版 社:机械工业出版社
出版日期:2009-4-1

 

15.2008-06-10~2008-07-30

《Google Web Toolkit开发实战》

原版书名:Google Web Toolkit Solutions: More Cool & Useful Stuff
出 版 社:机械工业出版社
出版日期:2009-1-1

 

14.2008-04-01~2008-06-01

《Google Web Toolkit应用程序开发》

原版书名:Google Web Toolkit Applications
出 版 社:机械工业出版社
出版日期:2008-9-1

 

13.2008-02-01~2008-03-30

《写给大家看的CSS书》

原版书名:Stylin’ with CSS: A Designer’s Guide (2nd Edition)
出 版 社:人民邮电出版社
出版日期:2009-2-1

 

12.2008-01-12~2008-01-31

《jQuery基础教程》

原版书名:Learning jQuery: Better Interaction Design and Web Development with Simple JavaScript Techniques
出 版 社:人民邮电出版社
出版日期:2008-7-1

11.2008-01-01~2008-01-12

《CSS网站设计手册》

原版书名:CSS Web Site Design Hands on Training (Hands-On Training)
出 版 社:机械工业出版社
出版日期:2008-4-1

 

10.2007-12-01~2007-12-31

《JavaScript学习宝典(第2版)》

原版书名:The Book of JavaScript, 2nd Edition: A Practical Guide to Interactive Web Pages)
出 版 社:清华大学出版社
出版日期:2008-9-1 

 

9.2007-10-23~2007-11-30

《JavaScript DOM高级程序设计》

原版书名:AdvancED DOM Scripting: Dynamic Web Design Techniques
出 版 社:人民邮电出版社
出版日期:2008-7-1

 

8.2007-09-01~2007-10-22

《Ajax构建工具箱指南》

原版书名: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经典实例(第2版)》

原版书名:PHP Cookbook,2nd Edition
出 版 社:中国电力出版社
出版日期:预计2009-10-1

 

4.2006-09-13~2006-11-30

《层叠样式表权威指南(第2版)》

原版书名:Cascading Style Sheets: The Definitive Guide, 2nd Edition
出 版 社:学习翻译,未公开

 

3.2006-09-13~2006-09-30

《10分钟学会正则表达式》

原版书名:Sams Teach Yourself Regular Expressions in 10 Minutes
出 版 社:学习翻译,未公开 

 

2.2006-09-01~2009- 09-12

《从DHTML到DOM脚本编程》

原版文章:From DHTML To DOMScripting
出 版 社:学习翻译,未公开 

 

1.2006-05-28~2006-08-20

《CSS设计师手册》

原版书名:Stylin’ with CSS: A Designer’s Guide (1nd Edition) 
出 版 社:学习翻译,未公开