【问题标题】:Programming practices - using helper method to hide object编程实践——使用辅助方法隐藏对象
【发布时间】:2016-05-02 17:32:25
【问题描述】:

我正在阅读closure library的代码段,我在那里看到了这段代码:

/**
 * Gets the document object being used by the dom library.
 * @return {!Document} Document object.
 */
goog.dom.getDocument = function() {
  return document;
};

为什么我们将文档引用包装在 getter 方法中?文档不是全局对象吗?

【问题讨论】:

  • 因此您可以模拟出来(替换方法)以进行测试并提供假文档。或者,任何时候,只需拆分底层实现。
  • @Sushanth-- 我不明白,即使这样,该方法也会返回修改后的值而不是正确的值,它的防御性如何?
  • 哎呀..我的错。我忽略了它

标签: javascript oop tdd google-closure-library


【解决方案1】:

我看到两个合乎逻辑的原因,都涉及闭包编译器:

  1. 类型检查 - 当调用这个函数时,闭包编译器会知道返回类型是Document 类型并且它永远不会为空。据推测,Google Closure 开发人员可以将其硬编码到 Closure Compiler 中,但通过明确说明,他们避免为存在于全局对象上的属性向 Closure Compiler 添加特殊情况。

  2. 缩小 - 当该函数通过ADVANCED_OPTIMIZATIONS 时,goog.dom.getDocument 可以缩小为a.b.c 之类的东西。 Closure Compiler 无法重命名 document,因为它无法控制全局对象上的变量名称,但它当然可以重命名 reference document 的函数以提供更小的源代码。

【讨论】:

  • 我不认为你明白我的问题,我问的是为什么我们首先需要函数,你的意思是函数会被缩小。
  • 对,因为你不能缩小document。您只能将 reference 缩小到此函数提供的document
  • 那么,您的意思是说压缩代码中将完全跳过关键字“document”?
  • 正确。 Google Closure 无法控制浏览器调用document 变量的内容。如果编译后的代码导致 document 属性重命名为 foo,则该 foo 属性的值将未定义,因为浏览器仍将在全局对象上设置名为 document 的属性。
  • 浏览器在全局对象上为您提供的任何其他属性也是如此。为了缩小这些属性,您首先需要创建一个引用它的函数。然后你可以缩小引用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-22
  • 2021-09-25
  • 2017-11-30
  • 1970-01-01
  • 2018-02-14
  • 2012-08-19
相关资源
最近更新 更多