SWFUpload.prototype.initSettings = function () { this.ensureDefault = function (settingName, defaultValue) { this.settings[settingName] = (this.settings[settingName] == undefined) ? defaultValue : this.settings[settingName]; }; // Upload backend settings this.ensureDefault("upload_url", ""); this.ensureDefault("preserve_relative_urls", false); this.ensureDefault("file_post_name", "Filedata"); this.ensureDefault("post_params", {}); // 略
这里比较有趣的是 this.ensureDefault 的定义。
不过是一个设置默认值的简单的 method, 但是其中的细节需要学习。作为一个 js 菜,我最初是疑惑 this.ensureDefault 体内的 this.settings 的 this。我实在搞不清这个 this 绑定的是什么,在看了下面的解释之后, 我才豁然开朗,这里严重推荐:
这里假设,若 ensureDefault 不定义成 public method, 而是定义成一个 private function 会怎样?按照上面链接中的解释,private function 中的 this 会绑定到 "global" object, 也就是浏览器关联的 window object,将无法使用 this.settings, 也就意味着 ensureDefault 需要再传递第3个参数。
为了保持接口的简洁,当然要定义成 public method.
需要注意的是,在退出 initSettings 时要删除 ensureDefault 方法,毕竟只用一次:
delete this.ensureDefault;