Object.bindProperties犀牛
问题描述:
()方法我对Object.bindProperties()方法中的犀牛两个问题:Object.bindProperties犀牛
- 是否有此方法的全面的文件,除了在https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions#Nashornextensions-loadWithNewGlobal?
- 它是一个如下所示的错误?
以下代码未将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
答
是否有一个全面的文档这种方法,
我认为只有一个是在您提供的网址。这是一个link,可直接将您带到该方法的文档。
以下代码没有将obj2的x,y和z属性绑定到obj,因为obj已经具有相同名称的属性。它是否记录在某处?
是的,它是在文档中提到:
如果目标对象已经包含一个名为 “foo” 的性质,来源的 “富” 是跳过(不绑定)。 (重点是我的)
我没有看到新的属性映射到我看错了。您看到null
的问题;它似乎为我工作。我正在使用JDK 1.8.0_25。null
的原因是源对象不知道您已将新属性添加到obj2
。 obj
上没有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
}
}
这可能是也可能不是你所需要的;这不是我想要的,所以这是一个惊喜的来源。虽然有一次我更详细地阅读了文档,但我想我应该预料到会基于以下评论感到惊讶:
建议将绑定属性视为不可配置属性以避免意外。