Наследование Javascript для переменной внутри функции (OpenERP)
В основном я пытаюсь переопределить функцию, расширив ее. У меня есть следующий базовый (упрощенный) код:
openerp.point_of_sale = function(db) {
var Order = Backbone.Model.extend({
exportAsJSON: function() {
return {'bigobject'}
}
})
}
Затем я пишу свой собственный .js, где я хочу наследовать и переопределять функцию exportAsJSON, и я не уверен, как его расширять. Вот мой ошибочный подход:
openerp.my_module = function(db) {
db.point_of_sale.Order = db.point_of_sale.Order.extend({
exportAsJSON: function() {
var order_data = this._super();
//... add more stuff on object
return order_data;
}
})
}
Каким будет правильный способ сделать это?
Надеюсь, я предоставил достаточную информацию для ответа (кстати, я работаю над OpenERP). Любая помощь будет оценена.
ИЗМЕНИТЬ:
Более конкретно, ошибка, по-видимому, связана с самим расширением:
db.point_of_sale.Order = db.point_of_sale.Order.extend({
... даже если я ставлю простой возврат 0; в моей функции exportAsJSON страница не загружается, и я получаю следующую ошибку в моей консоли браузера:
"Cannot call method 'extend' of undefined"
Ответы
Ответ 1
Я думаю, вам нужно что-то вроде SuperClass.prototype.method.call(this)
:
openerp.my_module = function(db) {
db.point_of_sale.Order = db.point_of_sale.Order.extend({
exportAsJSON: function() {
var order_data = db.point_of_sale.Order.prototype.exportAsJSON.call(this);
//... add more stuff on object
return order_data;
}
})
}
Ответ 2
Вот как вы обычно это делаете в JavaScript:
var eaj = db.point_of_sale.Order.prototype.exportAsJSON;
db.point_of_sale.Order = db.point_of_sale.Order.extend({
exportAsJSON: function() {
var order_data = eaj.apply( this, arguments );
//... add more stuff on object
return order_data;
}
})
Ответ 3
Это, в основном, проблема:
openerp.point_of_sale = function(db) {
var Order = Backbone.Model.extend({
^
|
this is a private variable
not a property!
Поэтому вы не можете получить к нему доступ вообще. Если он был определен следующим образом:
openerp.point_of_sale = function(db) {
openerp.point_of_sale.Order = Backbone.Model.extend({
^
|
this is now a property of point_of_sale
(basically public variable)
то вы можете получить к нему доступ так, как вы пытаетесь:
db.point_of_sale.Order = db.point_of_sale.Order.extend({
Итак, ответ: вы не можете этого сделать. Вам нужно расширить или изменить db.point_of_sale
вместо Order
.