Как заставить объявления свойств конструктора функции в JavaScript (ES5) перед их использованием? - PullRequest
1 голос
/ 13 февраля 2020

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

Проблема в том, что у меня есть действительно длинные конструкторы функций, и весь экземпляр этой функции содержит много свойств и поэтому я пытаюсь «инициализировать» эти свойства в самом начале конструктора функции, потому что мне хотелось бы точно знать, что используется, и заверить себя, что нет нового объявления свойств где-то в середине кода.

Я знаю, что это довольно просто, когда мы думаем о «нормальных» переменных, когда мы «используем строгие»:

"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 , как в названии. Спасибо за идеи:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...