11

基本上我试图通过扩展一个函数来覆盖它。我有以下基本(简化)代码:

openerp.point_of_sale = function(db) {

    var Order = Backbone.Model.extend({

        exportAsJSON: function() {
            return {'bigobject'}
        }
    })
}

然后,我正在编写自己的 .js,我想在其中继承和覆盖exportAsJSON函数,但我不知道如何.extend它。这是我的错误方法:

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({

...即使我放了一个简单的return 0; 在我的exportAsJSON函数中,页面未加载,并且我在浏览器控制台中收到以下错误:

"Cannot call method 'extend' of undefined" 
4

3 回答 3

2

我想你想要这样的东西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;
        }
    })
}
于 2012-10-30T18:59:23.333 回答
2

这基本上是你的问题所在:

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.

于 2012-10-31T02:54:42.510 回答
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;
    }
})
于 2012-10-30T19:00:26.360 回答