@private注释在 Google Closure JavaScript 代码中实际上做了什么
What does the @private annotation actually do in Google Closure JavaScript code?
当我在我的变量或函数上方添加注释时,其中包含@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
到底是做什么的呢?
访问控制
注释@private
、@protected
和@public
是闭包编译器的指令,可帮助开发人员强制执行属性和函数所需的可见性级别。
若要发出访问冲突警告,请使用编译器标志:
- -
- -jscomp_warning=可见性
若要发出访问冲突的错误,请使用编译器标志:
- -
- -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 中的可见性(私有和受保护字段)风格指南。
> cpeisert 在他的回答中暗示了这一点,但只是为了明确一点:这些可见性注释根本不会修改您的输出。
将函数标记为 @private 不会隐藏它,也不会使其在生成的代码中的可访问性低于编译器通常的可访问性,并且在运行时引入的任何第三方代码都可以调用此类函数。
这些注释提供的唯一访问保护是针对使用它们编译的代码。
相关文章:
- 这是什么 ==- javascript 运算符
- 我的单元测试选项是什么
- 全局变量和全局对象的属性之间有什么区别吗
- 打破承诺链的好方法是什么
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- Javascript中的空白是什么
- 是什么让一个“;Uncaught RangeError:超过了最大调用堆栈大小“;错误(Chrome,在其他浏览器中显示
- 实际上什么是redux
- setScrollbar() 方法实际上在模态.js中做什么
- 找出骨干网“路由器”实际上得到了什么
- 如果数组键实际上是字符串,那么数组和对象的区别是什么
- 是我提供的代码实际上与AJAX调用I'I’我想对Servlet做点什么
- @private注释在 Google Closure JavaScript 代码中实际上做了什么
- Math.floor(Math.random()) +1 实际上做了什么
- .files 在 JavaScript 中实际上做了什么?
- JSUnit 中的 assertEquals() 实际上做了什么
- Request.text()(以及从 Body 实现的其他函数)实际上做了什么
- 观察实际上由getter推导出的“属性”的细微差别是什么?
- 在JavaScript中,换行符实际上并不是在创建新行,有没有其他选择,或者我做错了什么
- Array.apply 实际上在做什么