Java 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

关于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.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
        }
    }
    
    这可能是你需要的,也可能不是;这不是我想要的,所以这是一个惊喜的来源。虽然一旦我更详细地阅读了文档,我想我应该会对以下评论感到惊讶:

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