JavaScript устанавливает переменные с помощью конструктора

Я пытался установить переменную в функции конструктора, которая может быть вызвана выражением вложенной функции. не слишком уверен, как это сделать

var test = function() {
  var a;

  function test(a, b, c) {
    this.a = a;
    this.b = b;
    this.c = c;

  }
  test.getvariableA = function() {
    //not returning a variable that is supposed to be set by the constructor
    console.log(this.a);
  };
  return test;
}();

var t = new test("pizza", "pasta", "steak");
//does not return the variable
test.getvariableA();
//this returns the variable
console.log(t.a);

test.getvariableA();

Это должно возвращать переменную, установленную конструктором. Может быть, я запутался с другим языком Спасибо за любую помощь заранее.

2 ответа

Решение

это возвращает переменную: console.log(t.a);

Правильно, так что собственность находится на t пример.

Но твой test.getvariableA функция не знает о t совсем! Он пытается получить доступ test.a когда вы вызываете test.getvariableA(),

Возможно, вы хотите поместить метод в объект-прототип вашего класса, а не в сам конструктор. Таким образом, он будет наследоваться всеми экземплярами (например, t), и вы можете позвонить на t получить t.a:

var test = function() {
  // var a; - this is not used anywhere, drop it

  function test(a, b, c) {
    this.a = a;
    this.b = b;
    this.c = c;

  }
  test.prototype.getVariableA = function() {
//    ^^^^^^^^^^
    console.log(this.a);
  };
  return test;
}();

var t = new test("pizza", "pasta", "steak");
t.getVariableA(); /*
^ */
console.log(t.a);

Проблема в том, что вы определяете getvariableA за пределами конструктора и присоединения его к функции test вместо. Следовательно getvariableA является "публичным" методом и не указывает на t экземпляр, который вы создали (или любой другой экземпляр, который вы создали бы, используя new ключевое слово).

Другими словами this внутри test.getvariableA указывает на сам конструктор функции, а не на какой-либо конкретный экземпляр этого конструктора (t в твоем примере).

Когда вы присоединяете метод к функции за пределами конструктора, вы можете получить к нему доступ, не создавая новых экземпляров. если ты console.log(test.getvariableA) вы можете видеть, что у вас есть доступ к этому методу без создания new случаи, тогда как console.log(test.a) показывает неопределенное как a присваивается каждому новому экземпляру класса.

Надеюсь, это прояснит хотя бы немного, извините, если не ясно.

Другие вопросы по тегам