gpt4 book ai didi

javascript - 当从 JavaScript 构造函数返回对象时(避免 'new' ),我该如何实现公共(public)成员?

转载 作者:行者123 更新时间:2023-11-29 18:35:51 24 4
gpt4 key购买 nike

我已经开始编写我的“类”类型的 JavaScript 函数,例如模块模式或显示模块模式。这避免了"new"的使用,并允许我在一个地方定义哪些函数是公共(public)的。但是,我一直看不出如何在此模式中使用和访问公共(public)数据成员。

例如下面的成员 'id' 可以通过 myobj.getId() 访问,但是 myobj.id 是未定义的。

function setup(){
var myobj = MyObject();
myobj.initialize();
alert(myobj.getId()); // returns 3, as expected
alert(myobj.id); // returns undefined
}
function MyObject(){
var id;
function initialize(){
//do some stuff that initializes data including...
id = 3;
}
return{
initialize:initialize,
id:id,
getId:function(){ return id;}
}
}

有没有办法让 myobj.id 返回在 initialize() 中设置的值?

最佳答案

您的问题是您没有利用闭包。 id:id 行创建一个新变量作为您要返回的对象文字的成员。这具有默认值 undefined。然后您将相同的变量 id 重新分配给它自己,再次 undefined

此外,模块是单个对象实例,而不是工厂函数。尝试这样的事情:

var myModule = (function(opts) {
var foo = opts.foo || 0, //private variables with default values
bar = opts.bar || 0, // if none are passed in

product = function() { //private method
return (foo * bar);
};

return {
getFoo : function() { //public methods
return foo;
},
fooTimesBar : function() {
return product();
}
}
})({
foo : 5, //options object
bar : 7
});

模块模式的核心是一个 self 执行的匿名函数,该函数声明变量,然后返回一个对象,该对象通过闭包有权访问这些变量。

最后的额外括号,这里包含一个对象文字和一些传入的选项,执行函数,然后返回一个对象并将其分配给 myModule

任何声明为该返回对象成员的东西都可以公开访问。即使在函数返回后,返回对象中的代码也可以通过闭包访问匿名函数中定义的变量。在匿名函数中声明的变量实际上是私有(private)的。函数外部的代码无法解决它们,除非通过返回对象中提供的方法。

整个过程在 myObject 中产生了一个对象实例。最多只能创建一个,这是一个模块的定义。但是,可以采用类似的方法来创建工厂函数。

关于javascript - 当从 JavaScript 构造函数返回对象时(避免 'new' ),我该如何实现公共(public)成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3257797/

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