Вызов частного метода в объекте javascript - PullRequest
0 голосов
/ 10 августа 2011

вот мой 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());

Здесь Arr в Common, когда установлено методом сеттера, работает нормально. Но когда я пытаюсь достичь того же самого, вызывая метод setter из другой функции-члена - registerArr того же объекта, он ничего не возвращает.

Как я могу использовать метод установки из другой функции-члена?

Ответы [ 2 ]

2 голосов
/ 10 августа 2011

Вам необходимо объявить переменные, содержащие функции, используя var.

Поскольку вы не объявляете их, переменные становятся глобальными.

Поэтому registerArr всегда будет использоватьфункции из последнего созданного экземпляра, поскольку это то, что находится в глобальных переменных.

Кроме того, вы неправильно используете цикл for ... in.
obj выполняет итерации по ключи каждого свойства объекта.
Чтобы выполнить итерацию по массиву, используйте обычный цикл for.

0 голосов
/ 11 августа 2011

В цикле for..in есть две проблемы:

  1. obj относится к клавише , а не к значению. Получить значение с помощью ns[obj].
  2. Аргумент для .hasOwnProperty() должен быть строкой. Добавить цитаты.

Вот исправленный цикл:

for (var obj in ns) {
    if (ns[obj].hasOwnProperty("getName")) {
        setArr(ns[obj].getName());
    }
}

Вот рабочий jsFiddle: http://jsfiddle.net/UdyYv/10/

Кроме того, в jsFiddle были некоторые другие проблемы, которые вызывали его сбой, вызывая ошибки при запуске. Вам нужно было объявить namespace.abc и namespace.abc.person.

Это оказалась красная сельдь. Поскольку вы создаете экземпляры abc.common с помощью ключевого слова new, abc.common необходимо указывать методы, а не возвращать объект. Удалите оператор возврата и замените его следующим:

this.setArr = setArr;
this.getArr = getArr;
this.registerArr = registerArr;

Если вы не хотите использовать этот подход, вам не следует создавать его экземпляр с помощью ключевого слова new. Вместо этого просто назовите это:

commonObj = abc.common();

...