Как я могу получить доступ к JS-объекту, который я определил?

#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. Если бы вы приняли мою правку, она не была бы отклонена: (