这段代码来自Addy Osmani的在线书籍“Learning JavaScript Design Patterns”。
// Extend an object with an extension
function extend( extension, obj ){
for ( var key in extension ){
obj[key] = extension[key];
}
}
它声称它可以扩展具有扩展名的对象。它在本书的样本中运作良好。 controlCheckbox
可以很好地适用于两个定义,Subject
和DOM checkbox
。
<input id="mainCheckbox" type="checkbox"/>
...
var controlCheckbox = document.getElementById( "mainCheckbox" ),
...
extend( new Subject(), controlCheckbox );
...
controlCheckbox["onclick"] = new Function( "controlCheckbox.Notify(controlCheckbox.checked)" );
但我无法理解为什么扩展? extend
的函数定义类似于覆盖,而不是扩展,controlCheckbox
从DOM checkbox
到Subject
在我可怜的眼里。有人可以帮我理解吗?
答案 0 :(得分:1)
extend
所做的是将extension
的所有属性添加到obj
并覆盖已存在的属性。
当您在javascript中说obj['attr'] = 'foo'
时,您会在对象attr
中创建属性obj
并为其指定foo
。如果attr
中已存在obj
,您将使用foo
覆盖它。
另一种语法是obj.attr='foo'
,但这样,您就无法使用动态属性名称(变量,如示例key
中所示)
一些有用的链接:
答案 1 :(得分:0)
以下是一个例子:
function extend( extension, obj ){
for ( var key in extension ){
obj[key] = extension[key];
}
}
var obj = { a: 1, b: 2 },
extension = { b: 20, c: 30 };
console.log("Before: ", obj);
extend(extension, obj);
console.log("After: ", obj);
输出:
Before: Object {a: 1, b: 2}
After: Object {a: 1, b: 20, c: 30}
很容易看出发生了什么:
a
中不存在字段extension
,因此保持不变。b
存在于两个对象中,因此extension
的字段b
覆盖。c
仅存在于extension
中,因此已添加至obj
。