AS是一个OO(object-oriented)语言。 面向对象的特性,让代码更加地简洁易读,本章将介绍除了事件处理器之外的另一个重要OO部分————脚本对象
,相当于其他语言的“类”(Class)
me关键字
me关键字在AS中指代当前脚本。 两个常见用途:
path to me
返回当前脚本的路径,如果在编写脚本时运行,返回结果将是AS编辑器的路径;class of me
返回“我”的类型,毫无疑问一般情况下就是script(脚本)
实践中,“path to me”非常有用,尤其在需要调用其他脚本文件时。
编写和使用基本的script对象
使用script对象的目的是将同样功能代码归类(专业术语为“封装”)。 你可以通过script和end script关键字来显式声明一个script。 示例如下:
代码一:
preperty dialogText : "ShowMe脚本中的代码"
script ShowMe
display dialog dialogText
on showSomething() --在脚本对象内部建立一个事件处理器
display dialog "这是脚本对象中的事件处理器"
end showSomething
end script
如果你尝试运行它,会发现没有任何效果! 没错,脚本对象本身就像一个工人,它不会自说自话的去完成任何工作,除非老板明确指示他要做。但是通过脚本对象内部的代码,这个工人能够做些什么事情已经被确定了。 脚本对象就是建立了这样一个“工人”。
接下来我们的任务自然是学习如何“指示这个工人去工作”。要执行脚本对象中得代码,应当使用run
命令:(请注意:以下代码,需要与上面代码(“代码一”)在同一文件中)
run ShowMe
注意:正如普通的事件处理器,位于脚本对象中的事件处理器,在没有得到明确指令时,是不会执行其中代码的。 使用工人的例子来说就是,工人有各种能力,老板让他用这个能力,他一定不会去用。
接下来的代码是如何运行位于脚本对象中的事件处理器
showSomething() of ShowMe
这些代码将仅仅执行ShowMe对象中的showSomething()事件处理器内的代码。
这里推荐另一种调用脚本对象的方法,即tell语句,适用于调用任何类型的脚本对象内部代码,这个方法提高了程序易读性和整洁性
tell ShowMe
run --执行脚本对象中的代码,但不包括事件处理器的代码
showSomething() --执行对应事件处理器内的代码,不执行其他代码
end tell
载入和调用外部script对象
要载入并运行来自其他脚本文件中的脚本对象,首先要求存在一个脚本文件,然后我们应该获得它的路径位置,其次载入它,最后运行它。
下面示例要求我们先将上面的“代码一”保存到桌面,并命名为“Script to Load”,然后新建一个脚本文件,输入如下代码:
set thePath to ((path to desktop) as text) & "Script to Load.scpt"
--获得目标脚本对象的位置
set theScript to load script file thePath
--载入该脚本,记得一定要给它“取名”
run ShowMe of theScript
--运行脚本对象
showSomething() of ShowMe of theScript
--运行脚本对象中的事件处理器
你会发现用了好多个of,确实,为了让傻傻地AppleScript编译器知道我在跟谁说话,必须一次次明确告诉他我想和谁说话。 当然你会想到又一个简单明了的方法:那就是用tell语句模块。
特别说明:其实载入外部脚本,并不要求该外部脚本拥有Script对象,任何脚本都是可以被加载的。开发者通常把一堆事件处理器放在一个文件中,这样就建立了一个“库”。
修改外部script对象中得属性变量
AS不仅允许载入外部script脚本,还允许修改外部script对象中的属性。
下面示例要求我们先将上面的“代码一”保存到桌面,并命名为“Script to Load”,然后新建一个脚本文件,输入如下代码:
set thePath to ((path to desktop) as text) & "Script to Load.scpt"
set theScript to load script file thePath
run ShowMe of theScript --初次运行
set dialogText of theScript to "哈哈,我修改了你!"
run ShowMe of theScript --修改之后再运行
两个同样地run ShowMe of theScript
显示了不同的对话框,证明外部脚本中的属性可以被修改。 不过当你再次运行脚本时,发现第三行的run ShowMe
结果仍然是本来外部脚本文件中所设定的。 没错,这里set dialogText
命令只是传递给了内存中的外部脚本,并没有写入脚本文件。 所以这里的set仅仅是“一次性”的,它不会影响外部脚本本身。
当然,如果你确实真需要修改外部脚本中得属性,也是可以的,AS提供了store script
命令。 在上面示例中添加一行新代码:
store script theScript in file thePath with replacing
那么第二次运行当前脚本时,第一个“showMe”仍然是“哈哈,我修改了你!”。 需要指出的时,with replacing
属性告诉store script命令“别怕,放心地去替换”,如果省略,AS将会询问是否确认替换,with replacing
本质上是一个危险地操作,因为你可以随意修改外部脚本。