How to extend javascript objects?
本问题已经有最佳答案,请猛点这里访问。
我在不同的文件中有2个bi对象,现在我想用其他对象扩展第一个对象。
第一对象
1 2 3 4 5 6 | var BI = BI || {}; BI = { firstInit: function () { console.log('I am first init'); } } |
其他文件
第二对象
1 2 3 4 5 | BI = { init: function () { console.log('I am init'); } } |
现在我想第二个对象也应该包含
您可以在这里使用jquery的
尝试以下代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | var BI = BI || {}; BI = { firstInit: function () { console.log('I am first init'); } } $.extend(BI, { init: function () { console.log('I am init'); } }); console.log(BI); |
这是演示
开箱即用,如果有好的X浏览器支持,你就不可能这么容易做到。
但是,jquery确实为您提供了一种让对象彼此扩展的方法:http://api.jquery.com/jquery.extend/
所以你应该这样做:
1 2 3 4 5 | var extended = $.extend({}, BI, { init: function () { console.log('I am init'); } }); |
第一个参数(空对象,
为此,我为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | mergeObjects = function () { // Convert the arguments Array-like object to an actual array var args = Array.prototype.slice.call(arguments); // Only one item? If we give this to $.extend it'll extend jQuery, which is // not the desired result, so let's spit it back verbatim if (args.length === 1) { return args[0]; } // We need to make sure we're always combining objects starting with a // completely empty one args.unshift(true, {}); return jQuery.extend.apply(jQuery, args); }; |
因此,您可以使用如下常见属性定义基本模块:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | var MyBaseModule.prototype = { options: {}, getOptions: function () { return this.options || {}; }, setOptions: function (options) { this.options = options; }, log: function () { // do your logging stuff here }, error: function () { // do your error handling stuff here } }; |
以及您的实际模块:
1 2 3 4 5 6 7 | var MyModule = function () { // constructor code here }; var MyModule.prototype = mergeObjects(MyBaseModule, { // define your module's methods here }); |
…现在,mymodule已经"继承"了
如果你想要一个普通的方法,这个帖子可能会有用。
在javascript中,函数是对象。因此,它们可以作为参数传递给函数或分配给其他变量(引用)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | var BI = { firstInit: function () { console.log('I am first init'); } }; var BI2 = { init: function () { console.log('I am init'); } } // copy the reference of function BI2.originalFirstInit = BI.firstInit; // run this function BI2.originalFirstInit(); // output:"I am first init" |
在JavaScript中有两种方法可以做到这一点。一种是使用原型链接,另一种是复制方法。在这种情况下,两个对象都将对象作为原型,因此需要复制该方法:
1 | BI2.init = BI1.firstInit; |
要复制jquery中的所有方法和属性,请使用$.extend;
1 | BI2 = $.extend({ init: function () { } }, BI1); |