我对Nashorn中的Object.bindProperties()方法有两个问题:
以下代码不会将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
--------------------------------
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添加一个新属性。 new属性绑定到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 = {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
--------------------------------
我使用的是JDK版本1.8.0_20。
由于 Kishori
答案 0 :(得分:0)
是否有关于此方法的综合文档,
我认为唯一的一个是您提供的网址。这是一个link,可以直接转到方法的文档。
以下代码不会将obj2的x,y和z属性绑定到obj,因为obj已经具有相同名称的属性。它是在某处记录的吗?
是的,文档中提到了它:
如果目标对象已经包含一个名为“foo”的属性,则源的“foo”被跳过(未绑定)。 (强调我的)
我没有看到新属性映射到我读错了。您看到null
的问题;它似乎对我有用。我正在使用JDK 1.8.0_25。null
的原因是源对象不知道您向obj2
添加了新属性。 u
上没有名为obj
的属性,因此会显示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
}
}
这可能是你需要的,也可能不是你需要的;这不是我想要的,所以这是一个惊喜的来源。虽然有一次我更详细地阅读了文档,但我想我应该根据这个评论感到惊讶:
建议将绑定属性视为不可配置的属性,以避免意外。