有没有办法在 Applescript 中模仿 类?

Is there a way to mimic classes in Applescript?

我目前正尝试在 Applescript 中创建一个新的“class”。我知道,不申请,技术上是做不到的。

但我试图用嵌入的方式模仿它 script:

script specialText
    property value : ""
    on flip()
        return reverse of (characters of my value) as string
    end flip
end script

set x to specialText

set value of x to "Hello World"

x's flip()

效果很好,returns "dlroW olleH" 符合预期,但是:

script specialText
    property value : ""
    on flip()
        return reverse of (characters of my value) as string
    end flip
end script

set x to specialText

set value of x to "Hello World"

x's flip() = specialText's flip()

这个returnstrue.

所以我现在的问题是,我可以在不让新变量引用原始变量的情况下做这样的事情吗?

关闭。 AS 没有 类,但您可以通过执行 script 块语句来创建脚本对象的新实例。

将其包装在这样的处理程序中:

to makeSpecialText()
    script specialText
        property value : ""
        on flip()
            return reverse of (characters of my value) as string
        end flip
    end script
    return specialText
end makeSpecialText

通过调用处理程序创建新实例,例如:

set x to makeSpecialText()
set y to makeSpecialText()
set z to makeSpecialText()

您现在拥有绑定到 xyz 的脚本对象的三个独立实例,每个实例都有自己的状态。

Apress 的 Learn AppleScript,第 3 版(我主要撰写)有一章是关于脚本对象的,涵盖了库(现在已经半过时了,因为 AS 终于在 macOS 10.10 中获得了本机库支持)和面向对象编程(合理考虑到一本 1000 页的书的长度限制。

警告:此解决方案非常占用内存,不建议这样做! Foo 的答案(被接受的答案)很可能更符合您的需求。


另一种方法是使用 copy 语句:

script specialText
    property value : ""
    on flip()
        return reverse of (characters of my value) as string
    end flip
end script

copy specialText to x

set value of x to "Hello World"

log x's flip() = specialText's flip()
log specialText's flip()
(*false*)
(**)

请注意 copy 命令的语法与 set 命令不同。所以它不是 copy newVariable to oldVariable 而是 copy oldVariable to newVariable.