Object.bindProperties()Nashorn的方法

时间:2014-10-08 23:29:19

标签: java javascript nashorn

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

  1. 此方法是否有全面的文档,https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions#Nashornextensions-loadWithNewGlobal
  2. 除外
  3. 这是一个如下所示的错误吗?
  4. 以下代码不会将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

1 个答案:

答案 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
    }
}

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

  

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