Java Nashorn的Object.bindProperties()方法
关于Nashorn中的Object.bindProperties()方法,我有两个问题:Java Nashorn的Object.bindProperties()方法,java,javascript,nashorn,Java,Javascript,Nashorn,关于Nashorn中的Object.bindProperties()方法,我有两个问题: 是否有关于此方法的全面文档,除了在 这是一个如下所示的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.bindProp
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};
// 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
----------------------------
现在,让我们向obj2添加一个新属性。新属性绑定到obj,但obj将新属性的值读取为null:
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};
// 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
----------------------------
下面是代码的另一个变体。这一次,我将目标对象启动为空。现在,将新属性添加到源代码可以正常工作
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};
// 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.020
谢谢
基绍里
是否有此方法的全面文档
我想只有你提供的网址。下面是一个直接带您到方法文档的示例
以下代码不会将obj2的x、y和z属性绑定到obj,因为obj已经具有相同名称的属性。它在什么地方有记录吗
是的,文件中提到:
如果目标对象已包含名为“foo”的属性,则源对象的“foo”将跳过(未绑定)。(我的重点)
我没有看到新属性映射到null
的问题;这似乎对我有用。我使用的是JDK1.8.025。我看错了。看到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
}
}
这可能是你需要的,也可能不是;这不是我想要的,所以这是一个惊喜的来源。虽然一旦我更详细地阅读了文档,我想我应该会对以下评论感到惊讶:
建议将绑定属性视为不可配置属性,以避免意外