javascript - 在 javascript 对象中调用私有(private)方法

标签 javascript closures javascript-objects

这是我的 JavaScript:

function namespace(nameSpaceString){
    var parts = nameSpaceString.split(".");
    var parent = window;
    var currentParent = '';

    for(var i=0, len=parts.length; i<len;i++){
        currentParent = parts[i];
        parent[currentParent] = parent[currentParent] || {};
        parent = parent[currentParent];
    }

    return parent;
}
abc = namespace('ns.abc');

abc.common = function(){
    var arr = [];

    setArr = function(v){
        if(v){
            arr.push(v);
        }
    }
    getArr = function(){
        return arr;
    }

    registerArr = function(ns){
        if(ns){
            for(var obj in ns){
                if(obj.hasOwnProperty(getName)){
                    setArr(obj.getName());
                }
            }
        }
    }
    return{
      setArr : setArr,
      getArr : getArr,
      registerArr : registerArr
   }
}

abc.form = function() {
var salutation = "Hi";
var name = '';

getSalutation = function(){
    return salutation;
}
getName = function(){
    return name;
}
setSalutation = function(s){
    salutation = s;
}
setName = function(n){
    name = n;
}

return{
    getSalutation:getSalutation,
    setSalutation:setSalutation,
    getName : getName,
    setName : setName
    }
}

persons = namespace('ns.abc.persons');
persons.Dave = new abc.form();

persons.Dave.setName("Dave");

persons.Mitchell = new abc.form();

persons.Mitchell.setName('Mitchell');
persons.Mitchell.setSalutation('Howdy');

alert(persons.Mitchell.getSalutation()+":"+persons.Mitchell.getName());
commonObj = new abc.common();

commonObj.registerArr(persons);
alert("Registration:"+commonObj.getArr())

commonObj.setArr(persons.Dave.getName());
commonObj.setArr(persons.Mitchell.getName());
alert("Setter Methods:"+commonObj.getArr());

这里,通过 setter 方法设置的 Common 中的 Arr 工作正常。但是,当我尝试通过调用同一对象的另一个成员函数“registerArr”来实现相同的目的时,它什么也不返回。

如何在另一个成员函数中使用 setter 方法?

最佳答案

您需要使用 var 声明保存函数的变量。

由于您没有声明它们,因此这些变量将成为全局变量。

因此,registerArr 将始终使用最后创建的实例中的函数,因为这就是全局变量中的内容。

此外,您还滥用了 for... in 循环。
obj 迭代对象中每个属性的
要迭代数组,请使用普通的 for 循环。

关于javascript - 在 javascript 对象中调用私有(private)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7016901/

相关文章:

javascript - jQuery 滚动 DIV 跳动且定位不正确

javascript - Visual Studio 2017 无法更改 project.csproj 的 <TypescriptModuleKind> 以进行 typescript 转译

javascript - 检测 AJAX 请求调用的 Iframe 滚动事件

循环内的 JavaScript 闭包 – 简单的实际示例

iOS Swift : Closures (Callbacks) versus Delegates, 什么时候使用哪个?

javascript - 如何读取/访问名称 :values of Objects stored within an Array?

javascript - javascript如何将对象属性名称管理为动态更改的对象?

javascript - 防止页面在后退按钮上重新加载(使用缓存)。或者向下滚动用户。 (问题,至少,iPhone)

function - 如何在Rust中命名关联函数的类型?

javascript - 我如何只对 Javascript 对象的一部分进行 JSON 编码?