gpt4 book ai didi

javascript - (揭示)模块模式、公共(public)变量和返回语句

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:32:43 25 4
gpt4 key购买 nike

我正在尝试了解(Revealing) Module Pattern 中的public` 属性 是如何工作的。 Carl Danley "The Revealing Module Pattern"指出的优势是:

Explicitly defined public methods and variables which lead to increased readability

让我们看一下这段代码(fiddle):

var a = function() {
var _private = null;
var _public = null;
function init() {
_private = 'private';
_public = 'public';
}
function getPrivate() {
return _private;
}
return {
_public : _public,
init : init,
getPrivate : getPrivate,
}
}();

a.init();
console.log( a._public ); // null
console.log( a.getPrivate() ); // "private"

调用a._public 时返回null。我现在可以操纵该公共(public)属性,例如 a._public = 'public';。但我无法从我的对象中更改它。或者至少这些更改没有通过。我有点期待它是 “public”,因为它之前由 init 方法更新。

这是否真的意味着我不能有任何方法来处理公共(public) 属性?那么这种模式中的 public 属性就没有什么意义了,对吧?我也没有运气就试过了(fiddle):

return {
_pubic : _public,
init2 : function() {
_public = 'public';
}
}

最后但同样重要的是,我对整个 return 语句有疑问。为什么不能只使用 return this; 来公开所有内容?由于 this 应该是自调用函数的上下文,它不应该只返回其中的所有内容吗?为什么我必须创建另一个返回的对象?在这个fiddle它返回 window 对象。

最佳答案

Does this actually mean, that I can't have any methods, that handle public properties?

不,这意味着您不能拥有公共(public)变量var _public 是一个变量,它不能从外部访问,当您修改私有(private)变量时,这不会反射(reflect)在您的公共(public) ._public 属性中。

如果你想公开事物,使用属性:

var a = function() {
var _private = null;
function init() {
_private = 'private';
this._public = 'public';
}
function getPrivate() {
return _private;
}
return {
_public : null,
init : init,
getPrivate : getPrivate,
}
}();

I can manipulate that public property, like a._public = 'public';. But I can't change it from within my object.

您可以在对象的方法中使用this,如上所示。或者您使用 a 来引用该对象,或者甚至可能存储对您返回的对象的本地引用。参见 here对于差异。

Or at least those changes aren't passed through

是的,因为变量不同于属性(不同于某些其他语言,如 Java,全局变量除外)。当您在对象字面量中导出 public: _public 时,它仅从 _public 变量中获取当前值,并使用它在对象上创建一个属性。没有对变量的持久引用,对一个变量的更改不会反射(reflect)在另一个变量中。

Why isn't it possible to just use return this; to make everything public? As this should be the context of the self-invoked function, shouldn't it just return eveyrthing in it?

变量是 JavaScript 中作用域的一部分。 (全局范围除外)这些范围不是语言可访问的对象。

this keyword不引用函数的这个范围,而是引用调用提供的上下文。它可以是方法调用中的基引用,构造函数调用中的新实例,或者像您这样的基本函数调用中的任何东西(或松散模式下的全局 window 对象)。

关于javascript - (揭示)模块模式、公共(public)变量和返回语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30545445/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com