#javascript #oop
#javascript #ооп
Вопрос:
У меня есть следующий объект:
var IOBreadcrumb = {
breadcrumbs: [],
add: function(title, url){
var crumb = {
title: title,
url:url
};
this.breadcrumbs.push(crumb);
}
};
Как я могу получить доступ к объекту?
var breadcrumb = new IOBreadcrumb();
breadcrumb.add('some title','some url');
console.log(breadcrumb.breadcrumbs);
Выдает Uncaught Type Error: object is not a function
ошибку.
Ответ №1:
Проблема в том, что вы пытаетесь использовать new
объект, но на самом деле он может предназначаться только для целевых функций. Вместо этого попробуйте следующее
var IOBreadcrumb = function IOBreadcrumb() {
this.breadcrumbs = [];
this.add = function(title, url) {
var crumb = {
title: title,
url:url
};
this.breadcrumbs.push(crumb);
};
};
В качестве альтернативы вы также можете воспользоваться прототипом здесь и поделиться определением add
среди нескольких экземпляров
var IOBreadcrumb = function IOBreadcrumb() {
this.breadcrumbs = [];
};
IOBreadcrumb.prototype.add = function (title, url) {
var crumb = {
title: title,
url:url
};
this.breadcrumbs.push(crumb);
};
Комментарии:
1. Также неплохо дать вашей функции имя, т. Е. .
var IOBreadcrumb = function IOBreadcrub() { ... };
. Таким образом, вы можете вызватьinstance.constructor.name
и вернуть типIOBreadcrumb
.2. @Peter не знал об этом. Это стандартное поведение?
3. @Peter: JScriptbugs . По крайней мере, более старые версии (7) и Opera (9.64) не поддерживают
instance.constructor.name
.4. Нет, я только что проверил,
name
свойство не является стандартным:( … пока.5. @Peter даже если это не стандартно, это, похоже, не оказывает здесь негативного эффекта, если единственной целью является отладка.
Ответ №2:
Используйте IOBreadcrumb.add('some title','some url');
В настоящее IOBreadcrumb
время это объект со статической функцией add
. Если вы хотите создать экземпляр IOBreadcrumb
, вы должны сделать его функцией.
var IOBreadcrumb = function() {
this.breadcrumbs = [];
this.add = function(title, url) {
this.breadcrumbs.push({
title: title,
url: url
});
};
};
var breadcrumb = new IOBreadcrumb();
breadcrumb.add('some title','some url');
Ответ №3:
function createIOBreadcrumb() {
return {
breadcrumbs: [],
add: function(title, url) {
var crumb = {
title: title,
url:url
};
this.breadcrumbs.push(crumb);
};
};
}
var breadcrumb = createIOBreadcrumb();
Ответ №4:
function IOBreadcrumb() {
var breadcrumbs = [];
this.add = function(title, url){
var crumb = {
title: title,
url:url
};
breadcrumbs.push(crumb);
}
};
Должен ли это делать, буквально, это не функция 😉
Комментарии:
1. Если бы вы приняли мою правку, она не была бы отклонена: (