Есть ли разница между ссылкой на идентификатор переменной объекта и использованием «this»? - PullRequest
1 голос
/ 29 марта 2020

Имея следующий код, где оба метода fc 1 и fc2 должны возвращать значение свойства x внутри объекта, который они создают и возвращают (а не из экземпляра Foo):

function Foo() {
  this.x = 5;
}

Foo.prototype.fc1 = function() {
  return {
    x: 6,
    getx() {
      return this.x;
    }
  }
}

Foo.prototype.fc2 = function() {
  const o = {
    x: 6,
    getx() {
      return o.x;
    }
  }
  return o;
}

Есть ли какая-либо внутренняя или существенная разница между методами fc1 и fc2 в отношении использования или ссылки на постоянный идентификатор внутри объекта, как это делается в fc2? Я склоняюсь к шаблону fc2, потому что мне он кажется более чистым (использование this только для одного звучит хорошо для меня!). Производительность не является проблемой, но в любом случае было бы полезно узнать, следует ли мне принимать во внимание некоторые соображения по этому поводу.

Не носитель английского языка sh, дайте мне знать, если я не быть ясно. Кроме того, не удалось сделать правильный поиск в Google. Я не приземлился ни в одной полезной статье. Статьи или документация помощи будут оценены.

Спасибо.

1 Ответ

2 голосов
/ 29 марта 2020

Во втором примере вы используете закрытие.

Закрытие больше o .. Это означает, что this даже не используется. Тем не менее, у него есть свои преимущества, это трюк, который вы можете использовать для создания защищенных объектов / инкапсуляции и т. Д. c.

. Например, ниже я превратил ваш пример в рабочий фрагмент. Затем я делаю ссылку на функцию getX в обоих случаях, а затем вызываю ее. Вы заметите, что первое 1 возвращает неопределенное значение, но второе, потому что вы используете замыкание, все еще возвращает 6.

Конечно, недостатком является то, что call apply & bind не будет иметь эффект на функцию тоже. Какой вариант вы выберете, конечно, зависит от того, как вы хотите использовать функцию, в вашем примере использование closure кажется более надежным вариантом. Теоретически, closure также может иметь небольшое преимущество в производительности, потому что this имеет нечто, называемое цепочкой прототипов, и это может замедлить процесс ..

function Foo() {
  this.x = 5;
}

Foo.prototype.fc1 = function() {
  return {
    x: 6,
    getx() {
      return this.x;
    }
  }
}

Foo.prototype.fc2 = function() {
  const o = {
    x: 6,
    getx() {
      return o.x;
    }
  }
  return o;
}


const f = new Foo();

console.log('calling foo.fc1.getx');
const fc1 = f.fc1().getx;
console.log(fc1());

console.log('calling foo.fc2.getx');
const fc2 = f.fc2().getx;
console.log(fc2());
...