2014-10-08 3 views
1

У меня есть два вопроса о Object.bindProperties метода() в Nashorn:Object.bindProperties() Метод Nashorn

  1. Есть исчерпывающая документация для этого метода, за исключением https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions#Nashornextensions-loadWithNewGlobal?
  2. Это ошибка, как показано ниже?

Следующий код не связывает свойства x, y и z объекта obj2 с 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.

Благодаря Кишори

ответ

0

Есть исчерпывающая документация для этого метода,

Я думаю, что только один находится в URL, который вы указали. Вот link, который ведет вас непосредственно к документации для метода.

Следующий код не связывает свойства x, y и z объекта obj2 с 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 
    } 
} 

Это может или не может быть то, что вам нужно; это было не то, что я хотел, и поэтому это стало неожиданностью. Хотя после того, как я прочитал документацию более подробно, я бы предположил, что я должен был удивиться, основываясь на этом комментарии:

Рекомендуется, чтобы связанные свойства обрабатывались как неконфигурируемые свойства, чтобы избежать неожиданностей.

 Смежные вопросы

  • Нет связанных вопросов^_^