Этот вопрос может содержать ответ, я думал о возможных решениях этого. Тем не менее, я хотел бы знать, если (и как) кто-то сделал это лучше.
Проблема в том, что у меня есть действительно длинные конструкторы функций, и весь экземпляр этой функции содержит много свойств и поэтому я пытаюсь «инициализировать» эти свойства в самом начале конструктора функции, потому что мне хотелось бы точно знать, что используется, и заверить себя, что нет нового объявления свойств где-то в середине кода.
Я знаю, что это довольно просто, когда мы думаем о «нормальных» переменных, когда мы «используем строгие»:
"use strict"
favouriteAnimal = 'honeybadger'; //Uncaught ReferenceError: favouriteAnimal is not defined
Это вызовет и Error, потому что мы не используется:
"use strict"
const favouriteAnimal = 'porcupine';
или
"use strict"
var favouriteAnimal = null //or let
favouriteAnimal = 'aardvark';
В этих следующих сценариях ios обратите внимание на 'this.importantFunction' и 'this.favouriteAnimal'. Оставшаяся часть функции конструктора демонстрирует лишь немного сложную структуру объекта, которая выиграла бы от такого раннего определения переменной (свойства).
Но борьба начинается в Objects, в следующем сценарии это то, что обычно делается , он работает, но он не предлагает таких мер предосторожности, чтобы заставить нас сначала определить все переменные.
function TypicalContructorFunction1 ()
{
this.someRandomFunctionWithoutRealPurpose = function () {
console.warn('someone really used me?');
}
this.someStuff = 'coffee break';
this.differentStuff = 'broken coffee';
this.importantFunction = function (animalName) {
this.favouriteAnimal = animalName;
};
this.importantFunction('sewer rat');
return this;
};
var typicalObject1 = new TypicalContructorFunction1();
console.log(typicalObject1.favouriteAnimal)
Консоль будет регистрировать объект со свойством favouriteAnimal, но структура объекта немного толще и поэтому не ясно видно, что такое свойство было определено.
Другой подход с функцией 'help':
function useProperty (object, propertyName, closure) {
if (object && typeof object[propertyName] !== 'undefined') {
closure(object[propertyName], object, propertyName);
} else {
throw new ReferenceError('property "' + propertyName + '" not declared');
}
};
const TypicalContructorFunction2 = function ()
{
this.someRandomFunctionWithoutRealPurpose = function () {
console.warn('someone really used me?');
}
this.someStuff = 'coffee break';
this.differentStuff = 'broken coffee';
this.importantFunction = function (animalName) {
useProperty(this, 'favouriteAnimal', function (property)
{
property = animalName;
});
};
this.importantFunction('drosophila melanogaster');
return this;
};
var typicalObject2 = new TypicalContructorFunction2();
Нет необходимости в console.log, потому что новый ReferenceError будет быть брошенным и остановленным казнью, чего я и хочу. Тем не менее, этот вызов функции, передача функции для простого изменения простого значения кажется немного излишним, и я думаю, что это может иметь и недостатки в производительности.
И, как последний (но не в последнюю очередь), я подошел с запечатыванием объекта после объявления всех свойств, поэтому не может быть добавлено никаких других свойств. (необходимо "использовать строгое")
"use strict"
function TypicalContructorFunction3 ()
{
this.someStuff = null;
this.differentStuff = null;
this.someRandomFunctionWithoutRealPurpose = null;
this.importantFunction = null;
Object.seal(this);
this.someRandomFunctionWithoutRealPurpose = function () {
console.warn('someone really used me?');
}
this.someStuff = 'coffee break';
this.differentStuff = 'broken coffee';
this.importantFunction = function (animalName) {
this.favouriteAnimal = animalName;
};
this.importantFunction('jerboa');
return this;
};
var test = new TypicalContructorFunction3();
ReferenceError: свойство "favouriteAnimal" не объявлено
Я думаю, что это может быть ответ, хотя он не запечатывает объект глубоко (определенно были бы некоторые фрагменты кода с глубокой запечатыванием в StackOverflow).
Я также знаю, что я все еще могу использовать функцию var / const / let inside, но такая переменные становятся закрытыми и не могут быть доступны извне функции.
Приходили ли вы к различным решениям этой проблемы?
PS: Пожалуйста, этот ответ задается для ECMAScript v5 , как в названии. Спасибо за идеи:)