如何扩展JavaScript对象?
这个问题在这里已经有了答案:
你可以在这里使用jQuery的$.extend
。
尝试下面的代码
var BI = BI || {};
BI = {
firstInit: function () {
console.log('I am first init');
}
}
$.extend(BI, {
init: function () {
console.log('I am init');
}
});
console.log(BI);
这是DEMO
开箱即用,您无法通过良好的X浏览器支持轻松完成此任务。
然而,jQuery确实为您提供了一种让对象扩展彼此的方法:http://api.jquery.com/jQuery.extend/
所以你会这样做:
var extended = $.extend({}, BI, {
init: function () {
console.log('I am init');
}
});
第一个参数(空对象, {}
)意味着BI
(第二个参数)的属性和传入的对象将被合并到新对象中。
我为这个目的写了一个小型的多态扩展到$.extend
,这将允许你从多个对象扩展,而后一个项目需要精确:
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);
};
所以,你可以用如下的通用属性来定义你的基本模块:
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
}
};
而你的实际模块:
var MyModule = function () {
// constructor code here
};
var MyModule.prototype = mergeObjects(MyBaseModule, {
// define your module's methods here
});
...现在MyModule具有“继承” options
属性和选项getter和setter。 你可以用new MyModule
实例化新模块;
如果你想要一个香草的方式,这篇文章可能会有用
在JavaScript中有两种方法。 一个是使用原型链,另一个是复制该方法。 在这种情况下,两个对象都将对象作为原型,因此您需要复制该方法:
BI2.init = BI1.firstInit;
要复制JQuery中的所有方法和属性,请使用$ .extend;
BI2 = $.extend({ init: function () { } }, BI1);
链接地址: http://www.djcxy.com/p/27341.html