道歉,如果这是一个非常明显的,记录良好的一个,但我没有找到很多文档,这有助于我如何最好地重新设置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);
答案 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>