Подтвердить что ты не робот

Как вызвать метод sibling в объекте, определяемом синтаксисом объекта?

Как это сделать?

var obj = {
 func1 : function(){
   // Do stuff 
 },
 func2 : function(){
  func1();  // does not work
  this.func1();  // does not work
 }
}

Изменить: пропустили точку с запятой

4b9b3361

Ответ 1

var obj = {
 func1 : function(){
   // Do stuff 
 },
 func2 : function(){
  obj.func1();  // It works fine
 }
}

Ответ 2

если вы хотите использовать ключевое слово 'this', вы должны сделать что-то вроде

function obj() {
    this.param = whatever;

}

obj.prototype.method1 = function(){
...
}

obj.prototype.method2 = function(){
    this.method1();
}

вы можете объявить методы в функции obj, но лучше использовать прототип, потому что он более эффективен - независимо от того, сколько экземпляров obj вы создаете, функции существуют только один раз. Если вы поместите функции в конструктор obj, каждый экземпляр obj имеет свою собственную копию функции. javascript делает некоторую магию, чтобы связать вызов метода с экземпляром объекта, на который он вызывается, чтобы убедиться, что 'this' означает правильную вещь в контексте

Ответ 3

Я не знаю, почему человек, задающий оригинальный вопрос, думал, что это не сработает. Их пример работает.

var obj = {
 func1 : function(){
   console.log("doing stuff");
 },
 func2 : function(){
  this.func1();  // works fine!
 }
}

Вы можете вставить это в консоль и вызвать obj.func2(), и все будет отлично. Вам не нужно указывать объект в этой ситуации.

Но будьте осторожны. Это решение не сработает, если вы определите еще одну анонимную функцию внутри func2, а затем попытайтесь использовать "this" внутри этой функции (например, если вы определяете обратный вызов). Вы получите сообщение об ошибке "Невыпущен TypeError: this.func1 is not a function". Проблема в этой ситуации заключается в том, что "this" больше не относится к внешнему объекту, теперь он относится к контексту этой новой внутренней функции. Например:

var obj = {
 func1 : function(){
   console.log("doing stuff");
 },
 func2 : function(){
   var func3 = function () {
     this.func1();  // doesn't work ("this" is no longer obj)
   }
   func3();
 }
}

Чтобы устранить эту проблему, вы можете сохранить локальную копию "this". Пример:

var obj = {
 func1 : function(){
   console.log("doing stuff");
 },
 func2 : function(){
   var ourThis = this;
   var func3 = function () {
     ourThis.func1(); // works fine!
   }
   func3();
 }
}