Вопрос по javascript, oop – Javascript: вызов методов объекта в этом объекте

28

Каков наилучший шаблон проектирования для достижения следующего (который не работает)?

var obj = (function() {

  // code defining private variables and methods

  var _obj = {
    property: value,
    method1: function() {
      // do stuff
    },
    method2: function() {
      // use property
      var prop = _obj.property; // obviously doesn't work
      // call method1
      obj.method1(); // "obj" not finished being defined yet!
    }
  };

  // obviously now I could do...
  var prop = _obj.property;

  return _obj;

})();

// and I could now do...
obj.method1();

Вариант, который я думаю, должен работать

var obj = (function() {

  var property = value,
      method1 = function() {
        // do stuff
      },
      method2 = function() {
        // use property
        var prop = property;
        // call method1
        method1();
      },
      _obj = {
        property: property,
        method1: method1,
        method2: method2
      };

  return _obj;

})();

Точно так же, как это работает для объектов, предназначенных для создания сnew оператор? В самой функции конструктора вы можете написатьthis.method(), Но что, если вы хотите сохранить конструктор небольшим, определяя только те вещи, которые, скорее всего, будут изменены при создании, а затем определяя остальное в прототипе? (Кажется, это общий шаблон.) Могут ли свойства / методы в прототипе каким-либо образом взаимодействовать?

var MyObj = function(name) {
  this.name = name;
};

var obj = new MyObj('Bob');

MyObj.prototype = {
  called_often: function() {
    // lots more code than just the following
    return document.getElementById('someID').value;
  },

  global_default: 'value', // can be changed, so need to pull value when run

  does_stuff: function(value) {
    var str = global_default + value, // can't access global_default on its own
        input = MyObj.called_often(), // doesn't work; MyObj.prototype.called_often() DOES
        name = this.name; // 'this' used in the prototype doesn't work
                          // even within a created object
    return name + input + str;
  }
};

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

Ваш Ответ

2   ответа
33

Ну, из вашего первого примера:

var _obj = {
    property: value,
    method1: function() {
      // do stuff
    },
    method2: function() {
      // use property
      var prop = this.property; 
      // call method1
      this.method1(); 
    }
  };

Это то, чтоthis значение для.

Теперь то, что вы не можете сделать, это сослаться на свойство "в процессе разработки" объект из другого места в объектном литеральном синтаксисе. (Пример трудно привести, потому что это синтаксически невозможно). В тех случаях, когда вы хотите это сделать, вам нужен один или несколько отдельных операторов присваивания.

Error: User Rate Limit ExceededthisError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Marcus Hughes
Error: User Rate Limit Exceededroundslider.jsError: User Rate Limit Exceeded$("#slider").roundSlider({ change: function(event) { traceEvent() }, });
Error: User Rate Limit Exceeded
9

Угадай, что? Вы делаете простые вещи сложными. Ответ Pointy хорош, но способ прототипа лучше по нескольким причинам. Вот почему я описываю (вернее, исправляю) последний метод.Проверьте эту скрипку.

var MyObj = function(name) {
  this.name = name;
};

MyObj.prototype = {
  called_often: function() {
    // lots more code than just the following
    return 'VALUE'; //document.getElementById('someID').value;
  },

  global_default: 'value', // can be changed, so need to pull value when run

  does_stuff: function(value) {
    var str = this.global_default + value, // can't access global_default on its own
        input = this.called_often(), // doesn't work; MyObj.prototype.called_often() DOES
        name = this.name; // 'this' used in the prototype doesn't work
                          // even within a created object
    return name + input + str;
  }
};

var obj = new MyObj('Bob');
Error: User Rate Limit Exceeded Marcus Hughes
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы