我对 Nashorn 中的 Object.bindProperties() 方法有两个问题:
- 除了https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions#Nashornextensions-loadWithNewGlobal之外,是否有此方法的综合文档?
- 是不是如下图的bug?
以下代码没有将 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 将新属性的值读取为 null:
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。
谢谢木尻