如何在AppleScript中模拟类且避免新变量引用原脚本对象问题
问题原因
你遇到的返回true的问题本质是:AppleScript中set命令对script对象执行的是引用赋值,你赋值给x的只是原specialText脚本的内存地址,修改x的属性等价于修改原脚本的属性,二者完全共享数据。
解决方案
方案1:使用copy命令创建独立实例
AppleScript的copy命令对script对象会执行拷贝操作,生成完全独立的新实例,替换原代码里的set即可:
script specialText property value : "" on flip() return reverse of (characters of my value) as string end flip end script -- 用copy替代set,创建独立实例 copy specialText to x set value of x to "Hello World" -- 单独修改原脚本的属性 set value of specialText to "Other Value" -- 此时返回 false,两个实例属性已独立 x's flip() = specialText's flip()
方案2:工厂构造函数(更推荐)
这种写法更贴近常规面向对象语言的类使用逻辑,不需要维护原型脚本,每次调用构造函数就会生成全新的独立实例,还支持传入初始化参数:
-- specialText类的构造函数 on newSpecialText(initValue) script instance property value : initValue on flip() return reverse of (characters of my value) as string end flip end script return instance end newSpecialText -- 创建两个完全独立的实例 set x to newSpecialText("Hello World") set y to newSpecialText("Test Text") -- 输出 dlroW olleH x's flip() -- 输出 txeT tseT y's flip() -- 对比返回 false,实例之间完全不共享数据 x's flip() = y's flip()
这种构造函数方案可以避免误操作修改原型脚本的问题,扩展性更强,后续要加成员方法、参数校验都可以直接在构造函数内实现。
内容的提问来源于stack exchange,提问作者gurkensaas
相关产品推荐
相关产品推荐

