42-讨论
4.10.3 讨论
在本秘诀中,使用jQuery提供的 $.extend() 方法。 $.extend() 返回对传入的第一个对象的引用,稍后的对象将重写它们所定义的任何属性。下列代码演示了实际的工作方式:
var obj = { hello: 'world' };
obj = $.extend(obj, { hello: 'big world' }, { foo: 'bar' });
alert( obj.hello ); //显示警告'big world'
alert( obj.foo ); // 显示警告'bar';
这使得本秘诀中的 myPlugin() 可以接受一个 options 对象,由它覆盖默认设置。下列代码展示了最终用户覆盖默认的CSS color 设置的方法:
$('div').myPlugin({ css: { color: 'blue' } });
$.extend() 方法的一个特殊情况是,当参数是一个对象时,它将扩展基本jQuery对象。因此,可以这样定义自己的插件,以扩展jQuery核心:
$.fn.extend({
myPlugin: function() {
options = $.extend({
message: 'Hello world',
css: {
color: 'red'
}
}, options);
return this.each(function() {
$(this).css(options.css).html(options.message);
});
}
});
$.extend() 还提供了一个深(递归)拷贝的机制。这通过传递布尔值true作为第一个参数来实现。下面是深拷贝的一个例子:
var obj1 = { foo: { bar: '123', baz: '456' }, hello: 'world' };
var obj2 = { foo: { car: '789' } };
var obj3 = $.extend( obj1, obj2 );
当没有传递true参数时, obj3 的内容如下:
{ foo: { car: '789 }, hello: 'world' }
如果指定深拷贝, obj3 在递归复制所有属性之后的内容如下:
var obj3 = $.extend( true, obj1, obj2 );
// obj3
{ foo: { bar: '123', baz: '456', car: '789 }, hello: 'world' }