2016-12-01 3 views
3

Я написал виджет JQuery UI, как это:Javascript: Как ссылаться на владельца объекта владельца внутри объекта параметров, подобного этому?

$.widget("ns.wid", { 
    options: { 
     attr1: "something1", 
     attr2: { 
      "sub_attr": this.__renderList, 
      "css": { 
       "opacity": '0.58' 
       }, 
     }, 
    }, 

    __renderList: function() { 
     console.log("I should be invoked through attr2.sub_attr!"); 
    } 
}); 

Теперь это не работает, так как this внутри attr2 не ссылается на экземпляр виджета, вместо этого он ссылается на Window. Как я могу ссылаться на экземпляр виджета, не называя его напрямую? Благодарю.

ответ

0

В застройщик вашего объекта связать функцию с контекстом LKE это: this._renderList = this._renderList.bind (это)

Или просто: "Sub_att": this._renderList.bind (это)

+0

Я слышал что-то плохое о .bind(), это считается плохой практикой в ​​JavaScript? –

+0

Кстати, ваш второй способ не работает, так как это относится к объекту Window. Для первого пути, куда должна идти эта линия? Внутри прототипа. –

+0

Вау, я уверен, что мы могли бы найти слишком много мнений в пользу, и слишком много мнений против. Я думаю, во-первых, вы должны понимать, как контекст и «это» работают в JS, может быть, вам не нужно объявлять _renderList в этот объект, а привязка вообще не займет места. Работает ли «привязка»? –

0

Я не уверен, что не простые объекты будут работать правильно с виджетами jQuery. вы можете попробовать это.

var widgetData = (new class { 
 
    get options() { 
 
     return { 
 
      attr1: "something1", 
 
      attr2: { 
 
      "sub_attr": this.__renderList, 
 
      "css": { 
 
       "opacity": '0.58' 
 
       }, 
 
      }, 
 
     }; 
 
    } 
 

 
    __renderList() { 
 
     console.log("I should be invoked through attr2.sub_attr!"); 
 
    } 
 
}); 
 

 
widgetData.options.attr2.sub_attr();