Когда вы пишете:
SomeObject s1 = new SomeObject("first");
s1
не является SomeObject
. Это ссылка на объект SomeObject
.
Следовательно, если вы назначаете s2 в s1, вы просто назначаете ссылки / дескрипторы, а базовый объект тот же. Это важно в Java. Все передается по значению, но вы никогда не пропускаете объекты вокруг - только ссылки на объекты.
Поэтому, когда вы назначаете s1 = s2
, а затем вызываете метод на s2
, который меняет объект, базовый объект изменяется, и это видно, когда вы ссылаетесь на объект через s1
.
Это один из аргументов для неизменяемости в объектах. Делая объекты неизменными, они не будут меняться под вами и, таким образом, будут вести себя более предикативно. Если вы хотите скопировать объект, самым простым / наиболее практичным методом является написать метод copy()
, который просто создает новую версию и копирует ее по полям. Вы можете делать умные копии с использованием сериализации / отражения и т. Д., Но это более сложно, очевидно.
Функции стрелок не привязывают this
. В соответствии с MDN:
Отсутствие привязки этого
До тех пор, пока функции стрелок, каждая новая функция не определила свое собственное значение
blockquote>this
(новый объект в случае конструктора, undefined в строгом режиме вызовы функций, объект контекста, если функция вызывается как «метод объекта» и т. д.). Это оказалось раздражающим объектно-ориентированным стилем программирования.Таким образом,
this
в вашем примере будет глобальным объектомwindow
, который, по-видимому, не имеет свойства, называемогоx
.Пример:
function foo() { let arrow = () => { console.log(this); // will use foo's this as arrow will never have its own this } arrow.call({"x": "x"}); // ... even if we specify it using bind, call, or apply } foo.call({"y": "y"}); // specifying the this for foo (this value will eventually be used by arrow because it will be availbale in its scope)
this
(даже сbind
они не будут). Они просто используют все, чтоthis
доступно в объеме, в котором они находятся. Я отправлю пример. – ibrahim mahrir 22 April 2017 в 11:50