Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript对象中调用私有方法_Javascript_Closures_Javascript Objects - Fatal编程技术网

在javascript对象中调用私有方法

在javascript对象中调用私有方法,javascript,closures,javascript-objects,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

以下是我的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());
函数名称空间(名称空间字符串){
var parts=nameSpaceString.split(“.”);
var父项=窗口;
var currentParent='';

对于(var i=0,len=parts.length;i您需要使用
var
声明包含函数的变量

因为您没有声明它们,所以变量变为全局变量

因此,
registerArr
将始终使用上次创建的实例中的函数,因为这是全局变量中的函数

此外,您在
循环中对…
错误使用了

obj
迭代对象中每个属性的键。

要在数组上迭代,请使用正常的
for
循环。

for..in
循环中的
有两个问题:

  • obj
    指的是键而不是值。使用
    ns[obj]
    获取值
  • .hasOwnProperty()
    的参数必须是字符串。请添加引号
  • 以下是更正的循环:

    for (var obj in ns) {
        if (ns[obj].hasOwnProperty("getName")) {
            setArr(ns[obj].getName());
        }
    }
    
    下面是一个正在工作的JSFIDLE:

    除此之外,JSFIDLE中还有一些其他问题导致它失败,在运行时抛出错误。您需要声明
    namespace.abc
    namespace.abc.person

    结果证明这是一个骗局。 由于您正在使用
    new
    关键字实例化
    abc.common
    的实例,
    abc.common
    需要指定方法,而不是返回对象。请删除return语句并替换为:

    this.setArr = setArr;
    this.getArr = getArr;
    this.registerArr = registerArr;
    
    如果不想使用此方法,则不应使用
    new
    关键字对其进行实例化。只需调用它:

    commonObj = abc.common();
    

    这里是要处理的代码——你的for..in循环是错误的!解决了这个问题,你的问题就会解决。(使用普通的迭代..不需要使事情复杂化)。此外,你不应该创建这么多全局变量!使用'var'是你的朋友!使用var声明属性很好。但是如果我使用“this”内部寄存器arr,即this.setArr(),这仍然指向公共对象的特定实例的本地声明方法,对吗?如果我不使用关键字new声明,如何获得同一对象的多个实例?看看persons对象,它遵循与公共对象相同的返回模式,对Dave和Mitchell很好objects@user-Y我们的函数不是返回对单例对象的引用,而是返回一个对象文本
    您得到了一个新的唯一对象。至于
    new
    关键字,我发现它确实仍然可以使用,这让我有点吃惊。事实证明,您的代码的真正问题是
    for..in
    循环中的两个问题,我将这两个问题添加到了我的答案中。