6

当我在变量或函数上方添加评论时,@private它实际上在做什么?我已经查看了文档,但我仍然不确定。

goog.provide('myproject');

/** @private */
myproject.foo = "bar";

当我打开 chrome 的开发工具(myproject.foo)时,我仍然可以访问它。和...

goog.require('myproject');

window.addEventListener('load', function() {
    //this works.
    document.body.textContent = myproject.foo;
});

上面的代码仍然将正文 textContent 设置为等于“bar”,即使在编译时也是如此。那么@private实际上是做什么的呢?

4

2 回答 2

6

访问控制注解@private@protected@public是闭包编译器的指令,可帮助开发人员强制执行所需的属性和函数的可见性级别。

要针对访问冲突发出警告,请使用 Compiler 标志:

  • --jscomp_warning=可见性

要为访问冲突发出错误,请使用 Compiler 标志:

  • --jscomp_error=可见性

访问控制注释是在每个文件的基础上强制执行的,这意味着任何属性都被注释@private@protected可以在同一文件中的任何位置访问。另请注意,编译器会从编译后的代码中删除这些注释,因为它们不是 JavaScript 语言的一部分。

例子

文件1.js

goog.provide('ns1');

/**
 * Global private variable.
 * @private
 */
ns1.global = 'foo';
alert('ns1.global = ' + ns1.global); // OK in same file.


/** @constructor */
ns1.Constructor = function() {
  /** @private */
  this.secret_ = ns1.global;
};

ns1.instance = new ns1.Constructor();
alert(ns1.instance.secret_); // No warning in same file.

文件2.js

goog.provide('ns2');

goog.require('ns1');

alert('ns1.global = ' + ns1.global); // Not allowed.

ns2.instance2 = new ns1.Constructor();
alert(ns2.instance2.secret_); // Not allowed.

设置标志--jscomp_error=visibility后,闭包编译器会发出以下错误。

ERROR - Access to private property global of ns1 not allowed here.
alert('ns1.global = ' + ns1.global);
                        ^
ERROR - Access to private property secret_ of ns1.Constructor not allowed here.
alert(ns2.instance2.secret_);
      ^

请参阅Google JavaScript 样式指南中的可见性(私有和受保护字段)

于 2012-07-06T21:55:14.117 回答
1

cpeisert 在他的回答中暗示了这一点,但要明确一点:这些可见性注释根本不会修改您的输出。

将函数标记为 @private 不会隐藏它或使其在生成的代码中比编译器通常更难访问,并且您在运行时引入的任何第三方代码都将能够调用此类函数。

这些注释提供的唯一访问保护是针对您使用它们编译的代码。

于 2012-07-09T10:13:07.840 回答