2016-02-11 2 views
2

Я создал функцию построения, которая создаст простой персонаж видеоигры. Конструктор принимает name в качестве аргумента и устанавливает свойство hName. Построенный объект имеет другие свойства, такие как speed, defaultEnergy, energyUsed и т. Д. (См. Код). Кроме того, у меня есть два метода внутри функции-конструктора: description и energyLevel. Я хочу использовать функцию energyLevel как обратный вызов для функции description.Функция JavaScript-конструктора возвращает ошибку синтаксического анализа при определении свойств

Ошибка синтаксического анализа на линии this.hName: name,

Вот код JavaScript:

var superHero = function (name) { 
    this.hName: name, 
    speed: 7, 
    defaultEnergy: 20, 
    energyUsed: 10, 
    flyAbility: true, 
    description: function (energyLevel) { 
     document.write(this.name + " has the capability to hold the hummer."); 
     energyLevel(); 
    }, 
    energyLevel = function() { 
     return ("<br>Current energy level is " + (this.defaultEnergy - this.energyUsed)); 
    } 
}; 

hero = new superHero("Thor"); 

document.write(hero.description()); 

Я хочу, чтобы следующий результат:

Thor имеет возможность удерживать Хаммера.

Текущий уровень энергии 10

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

+3

Ваша функция почти мгновенно превращается в объектный литерал. Вместо этого вы хотите сделать что-то вроде функции (name) {this.hName = name;} 'для всех свойств. – Sampson

+0

Это недопустимый javascript. Должно быть 'var hName: name;' или 'this.hName = name;' – GolezTrol

+0

да, я пытаюсь построить с ним объект. –

ответ

3

Когда вы звоните new Foo, создается объект для вас и доступен изнутри вашей функции. Для того, чтобы добавить свойства этого объекта, можно использовать ключевое слово this:

function SuperHero (name) { 
    this.hName = name; 
} 

var hero = new SuperHero("Thor"); 

console.log(`Name: ${hero.hName}.`); 

Вы также можете поставить большую часть этого на прототипе функция в:

function SuperHero (name) { 
    this.hName = name; 
    this.energyLevels = 10; 
} 

SuperHero.prototype = { 
    energyLevel: function() { 
     document.write(`Current energy level is ${this.energyLevels}.`); 
    }, 
    description: function (energyLevel) { 
     document.write(`${this.hName} has a description.`); 
     this.energyLevel(); 
    } 
}; 

предметы, расположенные на SuperHero.prototype объект будет , который используется совместно со всеми экземплярами SuperHero.

Для дальнейшего ознакомления см. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new#Description.

+0

Он возвращает имя. Как можно использовать 'hero.description()' для печати: 'Thor имеет возможность удерживать hummer. Текущий энергетический уровень равен 10' –

+0

@MaihanNijat Вероятно, вы не хотите, чтобы это описание было жестко закодировано в функции конструктора/логике прототипа , Вместо этого вы должны передать описание в функцию-конструктор и установить его на объект где-нибудь. – Sampson

+1

__NOTE: __ Это решение использует [строки шаблона] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/template_strings), которые недоступны в некоторых современных браузерах. Вы можете переписать их с помощью обычных строк и оператора '+'. – usandfriends

1

Это должно быть изменено, чтобы это для каждого отдельного имущества

var superHero = function (name) { 
    this.hName = name; 

    this.description = function (energyLevel) { 
     document.write(this.name + " has the capability to hold the hummer."); 
     energyLevel(); 
    }; 

}; 

Что вы пытаетесь делать работы по созданию объектов, но если вы не хотите, чтобы создать функцию-конструктор.

+2

У вас все еще есть неправильный синтаксис для this.description. – nnnnnn

+0

К сожалению, исправлено это! –

1

Способ, которым вы пытаетесь присвоить значения, не работает. Попробуйте переписать так:

var superHero = function (name) { 
    this.name = name; 
    this.speed = 7; 
    this.defaultEnergy = 20; 
    this.energyUsed = 10; 
    this.flyAbility = true; 
}; 

superHero.prototype = { 
     description: function (energyLevel) { 
     document.write(this.name + " has the capability to hold the hummer."); 
     document.write(this.energyLevel()); 
    }, 
    energyLevel : function() { 
     return ("<br>Current energy level is " + (this.defaultEnergy - this.energyUsed)); 
    } 
} 

var hero = new superHero("Thor").description(); 

DEMO

+0

Спасибо за ответ.Он возвращает 'Thor имеет возможность удерживать hummer.undefined' –

+1

Отредактировано @MaihanNijat – baao

1

Вы хотите создать superHero класс? Используйте метод prototype для методов класса и this.mymember = value; в конструкторе для внутренних переменных.Пример:

// class superHero 
 

 
var superHero = function superHero(name) { 
 
    this.hName = name; 
 
    this.speed = 7; 
 
    this.defaultEnergy = 20; 
 
    this.energyUsed = 10; 
 
    this.flyAbility = true; 
 
}; 
 

 
superHero.prototype.description = function description() { 
 
    document.write(this.hName + " has the capability to hold the hammer."); 
 
    return this.energyLevel(); 
 
}; 
 

 
superHero.prototype.energyLevel = function energyLevel() { 
 
    return "<br>Current energy level is " + (this.defaultEnergy - this.energyUsed); 
 
}; 
 

 
// Example 
 

 
var hero = new superHero("Thor"); 
 
document.write(hero.description());

+1

Спасибо за ответ. Я проголосую за него, но не мог отметить его, поскольку другой пользователь так быстро ответил на исправление. –

0

Вы должны использовать слово «это», чтобы показать, что вы работаете со свойствами и методами этого текущего экземпляра функции конструктора.

this.hName = name; 

и при вызове метода внутри ...

this.energyLevel(); 
1

Этот объект является недействительным полностью. Вам нужно выбрать функцию или литерал объекта, и вы смешаете их вместе.

с помощью литерала объекта вы делаете это:

var superHero = { 
 
    name: null, 
 
    speed: 7, 
 
    defaultEnergy: 20, 
 
    energyUsed: 10, 
 
    flyAbility: true, 
 
    description: function (energyLevel) { 
 
     document.write(superHero.name + " has the capability to hold the hummer."); 
 
     superHero.energyLevel(); 
 
    }, 
 
    energyLevel: function() { 
 
     return ("<br>Current energy level is " + (superHero.defaultEnergy - superHero.energyUsed)); 
 
    } 
 
}; 
 

 

 
//hero = new superHero("Thor"); 
 
superHero.name = "Thor"; 
 
superHero.description(10);

Используя функцию/класс, который вы можете сделать это:

var superHero = function(name) { 
 
\t self = this; 
 
    
 
    this.name= name; 
 
    this.speed= 7; 
 
    
 
    defaultEnergy= 20; 
 
    energyUsed = 10; 
 
    flyAbility = true; 
 
    this.description = function (energyLevel) { 
 
    
 
    \t \t \t document.write(self.name + " has the capability to hold the hummer."); 
 
     self.energyLevel(); 
 
    }; 
 
    this.energyLevel = function() { 
 
     return ("<br>Current energy level is " + (selfHero.defaultEnergy - self.energyUsed)); 
 
    }; 
 
}; 
 

 

 
hero = new superHero("Thor"); 
 
hero.description(10);

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

+1

Спасибо за ответ. Я проголосую за него, но не мог отметить его, поскольку другой пользователь так быстро ответил на исправление. Но ваше объяснение просто потрясающее. Это очистило мое замешательство между объектом и функцией/классом. –

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