我已经开始编写我的“类”类型 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
行创建一个新变量作为您要返回的对象文字的成员。它具有默认值未定义
。然后,您再次将相同的变量 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
});
模块模式的核心是一个自执行的匿名函数,它声明变量,然后返回一个对象,该对象通过闭包拥有对这些变量的特权访问权限。
末尾的额外括号,其中包含一个对象文字以及一些传入的选项,执行该函数,然后返回一个对象并将其分配给 myModule
。
声明为该返回对象的成员的任何内容都可以公开访问。即使函数返回后,返回对象中的代码也可以通过闭包访问匿名函数中定义的变量。匿名函数中声明的变量实际上是私有(private)的。函数外部的代码无法寻址它们,除非通过返回对象中提供的方法。
整个过程会在 myObject
中生成一个对象实例。最多只能创建一个,这是模块的定义。然而,可以采用类似的方法来创建工厂函数。
关于javascript - 当从 JavaScript 构造函数返回对象时(避免 'new' ),如何实现公共(public)成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3257797/