正确的方法来覆盖此JavaScript类方法

时间:2016-09-26 17:14:07

标签: javascript oop javascript-objects

道歉,如果这是一个非常明显的,记录良好的一个,但我没有找到很多文档,这有助于我如何最好地重新设置JavaScript类方法,如下所述。在这个片段中,如果我想从另一个JS文件中覆盖_other方法,在此文件之后加载,那么正确的方法是什么?谢谢你的帮助。

var review = {};
"use strict";

(function ($) {

    review.list = {

        _init: function () {
            // The code I want to leave intact
        },

        _other: function () {
            // The code I want to override
        },
        
        init: function () {
            $(document).ready(function () {
                review.list._init();
                review.list._other();
            });
        }
    };
    
    review.list.init();

})(jQuery);

2 个答案:

答案 0 :(得分:4)

您只需分配到review.list._other即可。如果您想要访问以前的版本,请先抓住它:

var oldOther = review.list._other;
review.list._other = function() {
    // Your new code here, perhaps calling oldOther if you like
    console.log("The new other code ran.");
};

示例:

// The original file
var review = {};
"use strict";

(function($) {

  review.list = {

    _init: function() {
      // The code I want to leave intact
    },

    _other: function() {
      // The code I want to override
    },

    init: function() {
      $(document).ready(function() {
        review.list._init();
        review.list._other();
      });
    }
  };

  review.list.init();

})(jQuery);

// Your file after it
(function($) {
  var oldOther = review.list._other;
  review.list._other = function() {
    // Your new code here, perhaps calling oldOther if you like
    console.log("The new other code ran.");
  };

})(jQuery);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

你真的很幸运,就是那样写的。它可以很容易地编写,以至于你无法覆盖_other ......

稍微偏离主题,但你在下面问过:

  

实际上,这个班级结构对你来说看起来合情合理吗?试图将脚趾浸入更多的OOP JS

我不知道你的设计限制因素,所以接下来的任何事情都要花一点时间......我应该注意到那里根本没有“阶级”(ES5和早期意义上都没有,也没有ES2015及其后的感觉),只是一个对象。 (这很好。)但看起来_init_other是私有的;他们可以真正私有而不是伪私人而不需要任何费用 - 除非你不能覆盖_other! :-)另外,我会允许整体控制代码确定何时发生初始化而不是在ready上进行。 (另外,在一个纯粹的风格笔记中,我完全没有这个两个空格 - 缩进废话,所以许多l33t类型似乎都在推广。如果你的代码是如此深层嵌套,只使用两个空格进行缩进是必要的,它需要重构;在我看来,四个空格是一个很好的明确缩进,没有那么大,它会将你的代码从右侧推出。)

如果需要ES5,那就是这样:

(function($) {
    var list = {
        init: function() {
            _init();
            _other();
        }
    };

    function _init () {
        // Can use `list` here to refer to the object
    }

    function _other() {
        // Can use `list` here to refer to the object
    }

    review.list = list;

})(jQuery);

...但是,再次,这使得覆盖_other变得不可能(好,不合理)。

或者,如果ES2015及以上版本没问题(对于这么简短的代码,差异非常小):

(function($) {
    let list = {
        init() {
            _init();
            _other();
        }
    };

    function _init () {
        // Can use `list` here to refer to the object
    }

    function _other() {
        // Can use `list` here to refer to the object
    }

    review.list = list;

})(jQuery);

答案 1 :(得分:0)

只需在下面添加新的覆盖...它会起作用......

var review = {};
"use strict";

(function($) {

  review.list = {

    _init: function() {
      console.log('I\'m init')
    },

    _other: function() {
      //This original will be overridden
      console.log('Original')
    },

    init: function() {
      $(document).ready(function() {
        review.list._init();
        review.list._other();
      });
    }
  };

  review.list.init();

})(jQuery);

review.list._other = function() {
  console.log('overridden')
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>