【问题标题】:Javascript inheritance on variable within a function (OpenERP)函数内变量的Javascript继承(OpenERP)
【发布时间】:2012-10-20 04:41:55
【问题描述】:

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

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

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

"Cannot call method 'extend' of undefined" 

【问题讨论】:

  • 我们需要查看更多您的代码。也许是一个 jsFiddle?

标签: javascript openerp


【解决方案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;
        }
    })
}

【讨论】:

  • 这可能是一个很好的答案,但是您确定class 和superclass 不共享原型吗?还是我需要更多地学习 BackBone?因为如果他们这样做了,那么显然exportAsJSON 将覆盖它,从而形成递归无限循环。
  • 感谢您的帮助。但是,恐怕错误在于我的 .extend 定义......而不是 exportAsJSON() 定义。请在我的原始帖子中检查我的编辑。我正在开发一个 OpenERP 框架;正如怪异所暗示的那样,也许需要对 BackBone 有更深入的了解。
【解决方案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;
    }
})

【讨论】:

  • 再次感谢。但是我用这种方法得到了一个不同的错误:“无法读取未定义的属性'原型'”。另外,我对我的原始帖子进行了编辑。如果有任何进一步的帮助,我将不胜感激。
  • 两个错误都是一样的。他们告诉你db.point_of_sale.Order 是未定义的。这意味着真正的错误实际上发生在更早的时候,point_of_sale.Order 应该被定义但没有。
  • 我试图做与@nicobustillos 基本相同的事情,并且这种方法有效(并且一看到它就有意义)。您在 cmets 中对另一个答案说调用原型会导致无限循环也是正确的,我试过了。
【解决方案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。

【讨论】:

  • 我明白了。这很有意义。所以基本上你建议我从扩展 point_of_sale:db.point_of_sale = db.point_of_sale.extend({ 开始,这确实不会出错。但是如何从那里覆盖 exportAsJSON 函数?
  • 恐怕没有办法覆盖它。你唯一能做的就是重新定义方法:dp.point_of_sale = some_new_function。是的,这意味着复制旧函数中的几乎所有内容,但至少它是可行的。
猜你喜欢
  • 1970-01-01
  • 2013-08-21
  • 2015-12-09
  • 1970-01-01
  • 2015-08-23
  • 1970-01-01
  • 2021-08-24
  • 1970-01-01
  • 2012-05-16
相关资源
最近更新 更多