1

我对 Nashorn 中的 Object.bindProperties() 方法有两个问题:

  1. 除了https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions#Nashornextensions-loadWithNewGlobal之外,是否有此方法的综合文档?
  2. 是不是如下图的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。

谢谢木尻

4

1 回答 1

0

是否有此方法的综合文档,

我认为唯一的一个是您提供的 URL。这是一个链接,可直接将您带到该方法的文档。

以下代码没有将 obj2 的 x、y 和 z 属性绑定到 obj,因为 obj 已经具有同名的属性。它是否记录在某处?

是的,它在文档中提到:

如果目标对象已经包含名为“foo”的属性,则跳过(未绑定)源的“foo”。(强调我的)

我没有看到新属性映射到的问题null;它似乎对我有用。我正在使用 JDK 1.8.0_25。我读错了。您看到的原因null是源对象不知道您向obj2. 没有调用任何属性uobj因此它会显示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
    }
}

这可能是也可能不是您需要的;这不是我想要的,所以它是一个惊喜的来源。尽管一旦我更详细地阅读了文档,我想我应该会根据以下评论感到惊讶:

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

于 2015-05-04T23:39:55.540 回答