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
присваивается каждому новому экземпляру класса.
Надеюсь, это прояснит хотя бы немного, извините, если не ясно.