2011-08-11 5 views
2
/* 
* Copy the enumerable properties of p to o, and return o. 
* If o and p have a property by the same name, o's property is overwritten. 
* This function does not handle getters and setters or copy attributes. 
*/ 
function extend(o, p) { 
     for(prop in p) { // For all props in p. 
      o[prop] = p[prop]; // Add the property to o. 
     } 
     return o; 
} 



/* 
* Return a new object that holds the properties of both o and p. 
* If o and p have properties by the same name, the values from o are used. 
*/ 
    function union(o,p) { return extend(extend({},o), p); } 

私はユニオンと思うが、「pの値が使用されている」ということを意味する。The Definitive Guide(6ed)エラー?

私はChromeでテストを行いました。私が間違っている?ごめんなさい。私は、特にJavascriptのための#1の本であり、6edは最近のものです。

VAR 0 = {X 1}

するvar P = {X:2}

関数(P、O)伸びる{

for(prop in p) 
    o[prop] = p[prop]; 
return o; 

}

関数共用体(o、p){

return extend(extend({},o),p); 

するvarグラム=連合(O、P)

g.x

ありがとうございました。

+2

あなたはそうです... – sje397

+1

ここでエラッタを送信できます:http://oreilly.com/catalog/errata.csp?isbn=9780596805531 –

答えて

3

はい、それはpからプロパティを読み取る必要があり、oは上書きされます。

ものの、このコードを書くときには、これを行うには少し安全です:

for(var prop in obj) { 
    if(obj.hasOwnProperty(prop)) { 
     // now you know it is actually a property on obj and not inherited from elsewhere 
    } 
} 
1

Flannigan氏の著書には、JavaScriptの「least bad」の本と考えられ、そう注意して使用されます。例えば、機能を拡張変数小道具が宣言されていないと、次

for(prop in p) { // For all props in p. 
    o[prop] = p[prop]; 
} 

は本当にhasOwnPropertyをテストを含める必要があり、それ以外の場合にも列挙のプロパティを継承コピーします。

for (var prop in p) { 
    if (p.hasOwnProperty(prop)) { 
     o[prop] = p[prop]; 
    } 
} 

はい、「組合」という用語は、セット理論をオブジェクトに厳密に適用しようとする人には誤解を招きます。 OがすでにP上の同じ名前のプロパティを持っている場合、それはP(有効 O に1の値を上書き)に一つとして同じ値が割り当てられます。

は、私は彼がPに相当を持っていない O の既存のプロパティ変更または削除されていないを表示しようとしていると思います。