2014-12-30 2 views
0

У меня есть следующий объект в приложении javascript (Node.js, если это имеет значение).Как остановить функцию от обработки как свойства в объекте javascript?

function myObject (myInput){ 
    this.myValue = myInput; 
    this.myAssociativeArray = {}; 
    this.myAssociativeArrayLen = function() { 
     var k; 
     var l = 0; 
     for (k in this.users){ 
      l = l + 1; 
     } 
     return l; 
    }; 
} 

Когда я вызываю функцию длины и войти на консоль я получаю это как выход:

function() { 
    var k; 
    var l = 0; 
    for (k in this.myAssociativeArray){ 
     l = l + 1; 
    } 
    return l; 
} 

Я действительно ни знаю, как это происходит, но оказывается, что функция обрабатывается как свойство строки, но у меня нет кавычек, так как это могло быть так? Я также заметил, что редактор, который я использую (Sublime), не меняет цвет последнего, как это происходит с другими. Я хотел бы, чтобы функция длины была частью объекта, чтобы я мог просто вызвать myObjectInstance. myAssociativeArray и получить длину. Любая помощь была бы очень признательна!

+0

Как вы призывающую журнал консоли? Обычно, если вы получаете печатную версию функции, потому что вы на самом деле не выполняете эту функцию, а ссылаетесь на нее, то есть 'console.log (someObject.myFunc)' вместо 'console.log (someObject.myFunc())' –

+0

In первый мир 'this.users' или' this.myAssociativeArray'? И как вы вызываете функцию: 'myObject.myAssociativeArrayLen' или' myObject.myAssociativeArrayLen() '? –

ответ

1

Возможно, что в вашем console.log вы фактически не используете эту функцию, и вы можете просто ссылаться на нее.

console.log(myObject.myAssociativeArrayLen()); 

против (то, что я думаю, что вы делаете)

console.log(myObject.myAssociativeArrayLen); 
0

Вы пытаетесь определить свойство, которое должно вызываться неявно. В этом случае вам необходимо использовать функцию getter.
Однако getter не предполагается использовать с конструктором функций, поскольку вы могли бы написать эквивалентный метод прототипа, используемый для всех экземпляров.
Но все же вы можете добавить геттер в следующим образом:

function myObject(myInput) { 
    this.myValue = myInput; 
    this.myAssociativeArray = {}; 
    Object.defineProperties(this, { 
      "myAssociativeArrayLen" : { //add the myAssociativeArrayLen property to this instance 
       "get" : function() {//define getter 
        //your logic 
        return smthing; 
       }, 
      } 
     }); 
} 
var x = new myObject(5); 
alert(x.myAssociativeArrayLen);//implicitly invoke the associated getter function 
Смежные вопросы