2015-11-06 2 views
0

Я пытаюсь распечатать свой объект, но он, похоже, не работает. Я очень новичок в кодировании и не уверен, что я здесь делаю неправильно. Пожалуйста помоги!Объект JavaScript не будет печатать

function Coffee(name, roast, location) { 
    this.name = name; 
    this.roast = roast; 
    this.location = location; 

    var esspresso = new Coffee("Starbuck's Esspresso Blend", "Dark", "Seattle"); 
    var cappuccino = new Coffee(coffee.name(espresso), "Dark", "Seattle"); 

    var CoffeeType = function() { 
     return coffee.name + " " + coffee.roast + " from " + coffee.location; 
    }; 
} 
document.write(CoffeeType(cappuccino)); 
+0

Вы пробовали проверить на наличие ошибок консоли? – arcyqwerty

+4

'CoffeeType' не существует там, где вы пытаетесь получить к нему доступ. Вы имели в виду поставить '' 'после' this.location = location; 'вместо 'document.write'? Не имеет смысла просто называть «Кофе». 'CoffeeType' также не ожидает никаких аргументов, и нет переменной с именем' coffee'. В целом это похоже на произвольное сшивание. В каком учебнике вы следуете? Я предлагаю вместо этого прочитать http://eloquentjavascript.net/. –

+0

Есть литература по сфере! http://toddmotto.com/everything-you-wanted-to-know-about-javascript-scope/ – Xogle

ответ

3

Если вы снимаете для подхода объектно-ориентированного, вы должны быть определяющим свои функции на цепи prototype.

function Coffee(name, roast, location) { 
    this.name = name; 
    this.roast = roast; 
    this.location = location; 
} 

Coffee.prototype.getCoffeeType = function() { 
    return this.name + " " + this.roast + " from " + this.location; 
}; 

var esspresso = new Coffee("Starbuck's Esspresso Blend", "Dark", "Seattle"); 
var cappuccino = new Coffee(esspresso.name, "Dark", "Seattle"); 

document.write(cappuccino.getCoffeeType()); 

Код выше будет иметь следующие последствия:

  • function Coffee(...) является главным конструктором класса.

  • Coffee.prototype.getCoffeeType - это функция, которая будет иметь каждый экземпляр класса Coffee. Эта функция сможет получить доступ к переменным this класса (членам класса).

  • esspresso и cappuccino являются экземплярами класса Coffee, воплощенные где-то в программном коде (за пределами функций класса определение/конструктор/прототип).

  • Затем вы можете вызывать функции, определенные в цепочке прототипов класса для этих объектов экземпляра.

  • Выход выше код даст вам «Esspresso Старбака Смешать Тьму из Сиэтла»

Обратите внимание, что дополнительное преимущество определения функции на prototype, что все экземпляры будут одни и те же getCoffeeType вместо того, чтобы иметь отдельную функцию (которая делает то же самое) для каждого экземпляра. (см. Use of 'prototype' vs. 'this' in JavaScript?). Если вы используете большую кофейную цепочку и производят миллионы кофе, тогда вы, вероятно, сохраните достаточное количество ресурсов (т. Е. Памяти).

+0

Ничего себе! Спасибо тонну за глубокое объяснение. Вы не знаете, насколько я это ценю! –

1

CoffeeType определяется только в объеме Coffee, и не могут быть использованы за пределами {}. Вам также необходимо передать в coffee в качестве аргумента для его использования. var CoffeeType = function(coffee) {.

Изменить программу для определения CoffeeType в более высоком объеме, поэтому он может быть использован вне тела Coffee «s:

function CoffeeType(coffee) { 
    return coffee.name + " " + coffee.roast + " from " + coffee.location; 
}; 

function Coffee(name, roast, location) { 
    ... 
1

Попробуйте это:

function Coffee(name, roast, location) { 

    this.name = name; 
    this.roast = roast; 
    this.location = location; 
    this.CoffeeType = function() { 
     return this.name + " " + this.roast + " from " + this.location; 
    }; 

} 

var esspresso = new Coffee("Starbuck's Esspresso Blend", "Dark", "Seattle"); 
var cappuccino = new Coffee("espresso", "Dark", "Seattle"); 

console.log(esspresso.CoffeeType()) 
Смежные вопросы