JavaScript устанавливает переменные с помощью конструктора - PullRequest
0 голосов
/ 18 сентября 2018

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

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 ]

0 голосов
/ 18 сентября 2018

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

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

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

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

0 голосов
/ 18 сентября 2018

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

Right, поэтому свойство находится в экземпляре 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);
...