Object.bindProperties犀牛

问题描述:

()方法我对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

是否有一个全面的文档这种方法,

我认为只有一个是在您提供的网址。这是一个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 
    } 
} 

这可能是也可能不是你所需要的;这不是我想要的,所以这是一个惊喜的来源。虽然有一次我更详细地阅读了文档,但我想我应该预料到会基于以下评论感到惊讶:

建议将绑定属性视为不可配置属性以避免意外。