2013-11-17 2 views
1

сейчас я учусь OO JS и у меня возникают проблемы оборачивать вокруг моей головы, почему это не работает:Объект получить аксессу не возвращает значение предназначено

var dog = { 

    name: { 

     value: 'PENNY', 

     get: function() { 
      return this.name; // returns [object Object] 
     } 
    } 
}; 

alert(dog.name); 

Я, очевидно, делает что-то неправильно, но Я не знаю, что. Любая помощь приветствуется.

+0

Вы потеряли контекст в основном, но почему 'this.name', а не' this.value'? – elclanrs

ответ

3

Значение свойства name на dog - это объект, который имеет метод get(). Если вы измените код на:

var dog = { 

    name: { 

     value: 'PENNY', 

     get: function() { 
      return this.value; // Change to 'value'. returns 'PENNY' 
     } 
    } 
}; 

alert(dog.name.get()); // Change to call the get() method on the name object 

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

var dog = { 

    value: 'PENNY', 

    get name() { 
     return this.value; // returns 'PENNY' 
    } 

}; 

alert(dog.name); 

который использует синтаксис геттер определить свойство name, который будет вызывать указанную функцию при чтении свойства.

+2

Вы правы, второй пример - это то, что ищет OP (по крайней мере, это то, что я думаю, поскольку упоминается «accessor»). – bfavaretto

+1

Спасибо! В этом есть смысл. –

+1

Престижность для ответа на вопрос OP =) Я немного отстал. Тем не менее, я рекомендую изучить 'console.log()' как лучший способ отладки и понимания js. – Andrew

1

Если вы пытаетесь сделать то, что, как я думаю, вы пытаетесь сделать, ваш синтаксис неверен. Попробуйте это:

var dog = { 

    name: { 

     _val: 'PENNY', 

     get value() { 
      return this._val; // returns 'PENNY' 
     } 
    } 
}; 

console.log(dog.name.value); 

http://jsfiddle.net/9Jq9h/

2

вы должны использовать console.log(dog.name) для проверки объекта.

Alert, как вы уже нашли, является очень неуклюжим способом отладки Javascript. То, что вы видите в окне предупреждения, является результатом принятия метода объекта toString имени объекта. Во многих Javascript реализаций toString возвращает «[object Object]» как способ печати «значения» объект

В этом случае, вы косвенно получать dog.name.toString() и поскольку имя объекта, он печатает [object Object].

Я включил JSFiddle с вашим кодом, а затем инструкцию console.log. http://jsfiddle.net/us9TL/, если вы откроете инструменты для разработчиков и запустите javascript, вы можете сравнить два выхода одного и того же объекта.

для просмотра результата console.log необходимо открыть инструменты разработчика.

Инструкции для инструментов разработчика открытия: Для Chrome: https://developers.google.com/chrome-developer-tools/ Для Firefox: https://developer.mozilla.org/en-US/docs/Tools/Web_Console

0

Почему не ...?

var dog = { 
    name : 'PENNY', 

    get: function() { 
     return this.name; 
    } 
}; 

Что с вами случилось, что вы определили имя как name : {}, где {} это обозначение для объекта. Этот объект имеет другое значение, называемое value, которое является строкой. Используя вашу логику, вы должны получить к ней доступ, как this.value (являющийся this идентификатором объекта name, а не объектом dog, из-за областей).

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