#javascript #typescript #closures
Вопрос:
Здравствуйте, я пытаюсь преобразовать библиотеку JS в машинописный текст. Ссылка на библиотеку: https://github.com/msarhan/hijrah-date Мне было трудно преобразовать основную функцию в класс. Я не понимаю ту часть, в которой почему HijrahDate
есть HijrahDate
функция ? Это старый способ создания конструктора ? Чего я пытаюсь добиться, так это преобразовать (если возможно) старый код JS в класс машинописи.
Упрощенная версия
var HijrahDate = (function(){
HijrahDate.isValid = isValid;
HijrahDate.isHijrahDate = isHijrahDate;
HijrahDate.prototype.getTime = getTime;
HijrahDate.prototype.setFullYear = setFullYear;
…
init();
function HijrahDate(year, monthOfYear, dayOfMonth, hours, minutes, seconds, milliseconds){
this._year = Number.NaN;
this._monthOfYear = Number.NaN;
this._dayOfMonth = Number.NaN;
var y, m, d, g;
…
}
…
function init(){
var years = [];
years['1300']=[30,29,30,29,30,29,30,29,30,29,30,29];
… //rest of years till years['1600']
var minYear = 1300;
var maxYear = 1600;
var isoStart = epochDayFromGregorain(new Date(1882, 11-1, 12));
hijrahStartEpochMonth = minYear * 12;
minEpochDay = isoStart;
hijrahEpochMonthStartDays = createEpochMonths(minEpochDay, minYear, maxYear, years);
maxEpochDay = hijrahEpochMonthStartDays[hijrahEpochMonthStartDays.length - 1];
minYearLength = 0, maxYearLength = 0;
for (var year = minYear; year < maxYear; year ) {
var length = _getYearLength(year);
minYearLength = Math.min(minYearLength, length);
maxYearLength = Math.max(maxYearLength, length);
}
…
}
return HijrahDate;
})();
...
До сих пор я пытался создать класс с помощью конструктора, который имеет инициализацию внутри
export class HijrahDate {
year: number;
monthOfYear: number;
dayOfMonth: number;
hours?: number;
minutes?: number;
private _gregorianDate: any;
private _monthOfYear: any;
private _dayOfMonth: any;
seconds?: number;
milliseconds?: number;
constructor(
year: number,
monthOfYear: number,
dayOfMonth: number,
hours?: number,
minutes?: number,
seconds?: number,
milliseconds?: number
) {
this.year = year;
this.monthOfYear = monthOfYear;
this.dayOfMonth = dayOfMonth;
this.hours = hours;
this.minutes = minutes;
this.seconds = seconds;
this.milliseconds = milliseconds;
this._gregorianDate = new Date();
this.init();
}
Комментарии:
1. Вы не показали, что
init
делает, поэтому мы не можем сказать, следует ли вам вызывать его из своего конструктора.2. » Я не понимаю той части, почему в Хиджрахдате есть функция Хиджрахдата? «- взгляните на шаблон модуля. Скорее всего, фактическая структура кода-это не две
HijrahDate
функции, а IEFE.3. Хорошо, спасибо, теперь я знаю, что это называется IIFE, я обновил код, в основном функция инициализации представляет собой гигантский массив(не знаю, почему в нем есть строка в качестве индекса), который представляет количество мотыльков с 1300 по 1600 год, поэтому я добавляю его сокращенную версию.
4. Что все еще вызывает сомнения, так это то, что в исходном коде
init
функция вызывается внеfunction HijrahDate(…)
конструктора, но в вашем новом коде она вызывается внутри. Если это IIFE (отрывок из вашего кода неубедителен, учитывая многоточие), это должен быть статический код. Может быть, вы также могли бы связать полный код?5. Спасибо. Эта
init
функция довольно бессмысленна в той жизни, она могла (должна была) быть встроена непосредственно в то место, где она вызывается. Поскольку вы, вероятно, не просто преобразуете все в класс, но и преобразуете его в синтаксис модуля, вам следует просто поместить все эти «частные» статические переменные в качестве констант в область действия вашего модуля (за пределамиclass
).
Ответ №1:
Реализация javascript генерирует класс с помощью IIFE, который эффективно предоставляет шаблон для создания «частного» API без предварительной встроенной поддержки. Саму init
функцию можно считать частью частного API. При вызове он никогда не отображается в возвращаемом классе. Кроме того, init
полагается на определенные частные переменные, такие как maxEpochDay
те, которые вы не объявили.
Любая функция или переменная, которые в конечном счете не будут представлены в возвращаемом классе через IIFE, могут быть объявлены закрытыми с помощью ts. Те, которые определены в свойстве прототипа в IIFE, могут быть включены в качестве методов класса, которые по умолчанию являются общедоступными или могут быть помечены для ясности.