Пожалуйста,: только чистый ванильный код JS. Нет jQuery или других внешних вещей, спасибо. :)Функция с вспомогательными функциями, но также и ее собственная ... функция ...?
Как создать функцию, которая содержит подфункции, но также возвращает значение, если не вызвана подфункция?
Например, возьмем числовую переменную num.
Я хочу добавить функцию round() к числовой переменной; если он вызван напрямую, я хочу, чтобы он округлялся вверх или вниз в зависимости от фактического значения переменной.
var num=4.12;
num.prototype.round=function(){return Math.round(this);}
Теперь я палочка круглый(), чтобы иметь подфункции, которые завершат вверх или вниз, не обращая внимания на десятичные значения.
num.prototype.round.up=function(){return Math.ceil(this);}
num.prototype.round.down=function(){return Math.floor(this);}
Если я делаю это и записываю num.round() в консоль, он делает то, что должен. Но если я зарегистрирую num.round.up() для консоли, я получаю сообщение об ошибке, указывающее, что num.round.up() не является функцией.
Так я пытаюсь положить суб-функции в основной функции декларации, как это:
num.prototype.round=function(){
var n=this;
this.up=function(){return Math.ceil(n);}
this.prototype.round.down=function(){return Math.floor(n);}
return Math.round(n);
}
Затем снова num.round() возвращает правильно округленное значение, но и num.round.up () и num.round.down() вернут ошибки «не функции».
Я схожу с ума, пытаясь понять это ... Я не только попробовать то, что я уже упоминал выше, но я также пытался сделать это незамедлительно, исполняющих функции, как это:
num.round=(function(){
return function(){
var that=this;
/* anything in here is already useless because this
is no longer num's value but [Object window]... */
}
})();
Я думаю, часть проблемы в том, что я настолько слаб в ООП, что я просто понятия не имею о правильной терминологии ... естественно, это не помогает при поиске подсказок или когда дело доходит до понимания возможных причин, почему что-то вроде этого не должно работать ...
Итак, есть ли вообще способ сделать это?
Вы не можете определить круг как функцию и в том же месте, где объект имеет две функции ('up' и' down'). –
По умолчанию только конструкторы имеют свойство 'prototype'. '4.12' не является объектом, а тем более конструктором. – Oriol
В основном проблема заключается в том, что при вызове 'num.round.up' значение' this' будет 'num.round', а не' num'. Тогда я не рекомендую этот подход. Лучше разрешить 'num.round' получать необязательный параметр и называть его как' num.round() ',' num.round ('up') 'или' num.round ('down') '. – Oriol