2012-05-23 2 views
0

Я совершенно новый для javascript, так что, возможно, это глупая ошибка. Я создал объект вроде follwing:Javascript, проходящий объект как параметр функции

function objA(){ 
    this.prop1; 
    this.prop2; 
    this.prop3; 
    this.func1=function(){ 
     alert('func1'); 
    } 
    this.func2=function(){ 
     alert('func2'); 
    } 
} 

теперь у меня есть функция, где я хочу, чтобы передать объект:

var foo=new objA; 

function test(foo){....} 

Проблема заключается в том, что, когда я называю тест(), я получаю выполняются функции в objA (objA.func1 и objA.func2). Я хотел бы просто получить значение свойства objA. я должен использовать другую функцию и массив, заполнить массив со свойствами objA, а затем передать массив:

var arrayA={} 

function fillArray(data){ 
    arrayA.prop1=data.prop1; 
    arrayA.prop2=data.prop2; 
    arrayA.prop3=data.prop3; 
} 

function test(arrayA){....} 

ли это единственный путь, или я делаю что-то не так?

+3

Да, ваша тестовая функция ошибочна, когда она делает что-то, чего вы не хотите. Не могли бы вы опубликовать его, возможно, это важно для вопроса? – Bergi

+0

Согласен ... не видя кода для 'test()' невозможно сказать, что происходит. – Pointy

+0

Как вы можете видеть там, он работает нормально http://jsfiddle.net/GhNmK/1/. Таким образом, ваша тестовая функция вызвана тем, что сказал Bergi –

ответ

2

Функции : свойства объекта (они являются первоклассными значениями), и таким образом они отображаются в петлях for (var propName in myObj), как и любое другое свойство. Вы можете избежать их изучение далее через:

for (var prop in myObj){ 
    if (!myObj.hasOwnProperty(prop)) continue; // Skip inherited properties 
    var val = myObj[prop]; 
    if (typeof val === 'function')) continue; // Skip functions 

    // Must be my own, non-function property 
} 

Кроме того, в современных браузерах можно сделать определенные свойства (например, ваши функции) несчетных, поэтому они не будут отображаться в for ... in цикле:

function objA(){ 
    this.prop1 = 42; 
    Object.defineProperty(this,'func1',{ 
    value:function(){ 
    ... 
    } 
    }); 
} 

Подробнее об этом см. В документах для Object.defineProperty или Object.defineProperties.

Наконец, если вам не нужно, чтобы определить свои функции, closures их можно определить на опытном образце Вашего объекта, в этом случае испытание hasOwnProperty заставит их быть пропущено:

function objA(){ 
    this.prop1 = 42; 
} 
objA.prototype.func1 = function(){ 
    // operate on the object generically 
}; 

var a = new objA; 
"func1" in a;    // true 
a.hasOwnProperty("func1"); // false 
+0

Благодарим вас за разъяснение. Я попробую метод определения прототипа. Я выбираю закрытие, потому что мне кажется более чистым. – DarioD

Смежные вопросы