2014-10-08 130 views
1

()方法我對Object.bindProperties()方法中的犀牛兩個問題:Object.bindProperties犀牛

  1. 是否有此方法的全面的文件,除了在https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions#Nashornextensions-loadWithNewGlobal
  2. 它是一個如下所示的錯誤?

以下代碼未將obj2的x,y和z屬性綁定到obj,因爲obj已具有相同名稱的屬性。它是否記錄在某處?

var obj = {x:10, y:20, z:30}; 
var obj2 = {x:100, y:200, z:300}; 

// bind properties of 'obj2' to 'obj' 
Object.bindProperties(obj, obj2); 

print(obj.x, obj.y, obj.z); 
print(obj2.x, obj2.y, obj2.z); 
--------------------------------- 
10 20 30 
100 200 300 
-------------------------------- 

現在,讓我們添加一個新的屬性OBJ2。新的屬性被綁定到OBJ,但OBJ讀取新屬性的值作爲空:

var obj = {x:10, y:20, z:30}; 
var obj2 = {x:100, y:200, z:300}; 

// Add a new property to obj2 
obj2.u = 600; 

// bind properties of 'obj2' to 'obj' 
Object.bindProperties(obj, obj2); 

print(obj.x, obj.y, obj.z, obj.u); // obj.u is null. Why? 
print(obj2.x, obj2.y, obj2.z, obj2.u); 

--------------------------------- 
10 20 30 null 
100 200 300 600 
-------------------------------- 

而且,這裏是工作的代碼的另一種變體。這一次,我開始將目標對象設爲空。現在,將新屬性添加到源可以正常工作。

var obj = {}; 
var obj2 = {x:100, y:200, z:300}; 

// Add a new property to obj2 
obj2.u = 600; 

// bind properties of 'obj2' to 'obj' 
Object.bindProperties(obj, obj2); 

print(obj.x, obj.y, obj.z, obj.u); // obj.u is correct.It is 600 
print(obj2.x, obj2.y, obj2.z, obj2.u); 

---------------------------- 
100 200 300 600 
100 200 300 600 
---------------------------- 

我使用JDK版本1.8.0_20。

感謝 Kishori

回答

0

是否有一個全面的文檔這種方法,

我認爲只有一個是在您提供的網址。這是一個link,可直接將您帶到該方法的文檔。

以下代碼沒有將obj2的x,y和z屬性綁定到obj,因爲obj已經具有相同名稱的屬性。它是否記錄在某處?

是的,它是在文檔中提到:

如果目標對象已經包含一個名爲 「foo」 的性質,來源的 「富」 是跳過(不綁定)。 (重點是我的)

我沒有看到新的屬性映射到null的問題;它似乎爲我工作。我正在使用JDK 1.8.0_25。我看錯了。您看到null的原因是源對象不知道您已將新屬性添加到obj2obj上沒有u屬性,所以它會顯示null。源對象不會「跟蹤」目標對象,反之亦然。

還有一些其他的注意事項。 bindProperties只做淺拷貝。所以如果你有嵌套的對象,並且你修改了源對象的一個​​屬性,它會反映到目標對象中。例如:

var test = { 
    a: { 
     x: 10, 
     y: 10, 
     z: 10 
    } 
}; 
print("test0:" + JSON.stringify(test, null, 4)); 

test.b = {}; 
Object.bindProperties(test.b, test.a); 
print("test1:" + JSON.stringify(test, null, 4)); 

test.b.y = 100; 
print("test2:" + JSON.stringify(test, null, 4)) 

產量:

test0:{ 
    "a": { 
     "x": 10, 
     "y": 10, 
     "z": 10 
    } 
} 
test1:{ 
    "a": { 
     "x": 10, 
     "y": 10, 
     "z": 10 
    }, 
    "b": { 
     "x": 10, 
     "y": 10, 
     "z": 10 
    } 
} 
test2:{ 
    "a": { 
     "x": 10, 
     "y": 100, 
     "z": 10 
    }, 
    "b": { 
     "x": 10, 
     "y": 100, 
     "z": 10 
    } 
} 

這可能是也可能不是你所需要的;這不是我想要的,所以這是一個驚喜的來源。雖然有一次我更詳細地閱讀了文檔,但我想我應該預料到會基於以下評論感到驚訝:

建議將綁定屬性視爲不可配置屬性以避免意外。