Понимание размещения this в JavaScript при создании объекта - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь понять, почему функция Fruit работает при создании объекта:

function Fruit(name, color, shape){
    this.name = name;
    this.color = color;
    this.shape = shape;
}

var apples = new Fruit('apple', 'red', 'round');

Почему это не так:

function Fruit(name, color, shape){
   name = this.name;
   color = this.color;
   shape = this.shape;
}

, если, например, имяпосле знака равенства то, что указывает на «яблоко», а это указывает на параметры в переменной яблоки, не имеет ли смысла ставить это после?

Извините заранее, если я не сформулировал фразувопрос правильно.


Чтобы выяснить, почему я не понимаю этого, давайте изменим имена, чтобы они не совпадали:

 function Fruit(name, color, shape){
     this.thename = name;
     this.thecolor = color;
     this.theshape = shape;
 }

var яблок = новый фрукт ('apple ',' red ',' round ');

И это все равно будет работать, поскольку объектными яблоками будет {thename:' apple ', thecolor:' red ', theshape:' round '}

так что же тогда notame = 'apple', если в функции было thename = this.name?

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Чтобы уточнить, что вы предлагаете (отредактировано в соответствии с вашими правками), если бы у нас была такая функция:

function Fruit(name, color, shape){
    thename = this.name;
    thecolor = this.color;
    theshape = this.shape;
}

, то вызов

var apples = new Fruit('apple', 'red', 'round');

будет означать, что:

thename = this.name
thecolor = this.color
theshape = this.shape

Теперь вы пытаетесь сохранить несуществующие атрибуты в переменных, которые не будут доступны после вызова функции и, вероятно, в конце будут собраны сборщиком мусора.В этом случае результат не будет иметь атрибутов и не сохранит данные, которые были ему переданы.

Ваше недопонимание заключается в том, что к параметру name функции обращаются с использованием this.name вместо name, вот пояснение:

  • параметры функций доступны с использованием любого имени, которое им было присвоено во время начального определения функций.
  • атрибуты доступны с помощью вызова this.attribute

Это различие сделано для того, чтобы было ясно, используете ли вы атрибут или если вы используете параметр.

0 голосов
/ 24 октября 2018

Причина, по которой это только первый способ, заключается в том, что оператор присваивания = назначает правую часть левой стороне, а не ссылку.

...