3

这段代码来自 Addy Osmani 的在线书籍《学习 JavaScript 设计模式》。

// Extend an object with an extension
function extend( extension, obj ){
  for ( var key in extension ){
    obj[key] = extension[key];
  }
}

它声称它可以通过扩展来扩展对象。它在书中的示例中运行良好。controlCheckbox可以很好地用于定义和SubjectDOM checkbox

<input id="mainCheckbox" type="checkbox"/>
...
var controlCheckbox = document.getElementById( "mainCheckbox" ),
...
extend( new Subject(), controlCheckbox );
...
controlCheckbox["onclick"] = new Function( "controlCheckbox.Notify(controlCheckbox.checked)" );

但我就是不明白为什么要延长它?在我可怜的眼里,函数定义extend看起来像是覆盖,而不是从 DOM延伸到。有人可以帮我理解吗?controlCheckboxcheckboxSubject

4

2 回答 2

1

什么extend是将所有属性添加extensionobj并覆盖已经存在的属性。

当您obj['attr'] = 'foo'在 javascript 中说时,您attr在对象中创建属性obj并分配foo给它。如果attr已存在于 中obj,您将用 覆盖它foo

另一种语法是obj.attr='foo',但是这样,您不能使用动态属性名称(变量,例如您的示例key

一些有用的链接:

于 2013-10-12T00:14:43.133 回答
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}

很容易看出发生了什么:

  1. 字段a不存在于 中extension,因此保持不变
  2. Fieldb存在于两个对象中,因此被' field覆盖extensionb
  3. 字段c只存在于 中extension,因此被添加obj.
于 2013-10-12T00:24:57.763 回答