2016-02-25 2 views
2

Пожалуйста,: только чистый ванильный код 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]... */ 
    } 
})(); 

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

Итак, есть ли вообще способ сделать это?

+0

Вы не можете определить круг как функцию и в том же месте, где объект имеет две функции ('up' и' down'). –

+0

По умолчанию только конструкторы имеют свойство 'prototype'. '4.12' не является объектом, а тем более конструктором. – Oriol

+2

В основном проблема заключается в том, что при вызове 'num.round.up' значение' this' будет 'num.round', а не' num'. Тогда я не рекомендую этот подход. Лучше разрешить 'num.round' получать необязательный параметр и называть его как' num.round() ',' num.round ('up') 'или' num.round ('down') '. – Oriol

ответ

0

Может быть что-то вроде:

function num(n) { 
    this.num=n; 
    this.round=Math.round(n); 
    this.up=Math.ceil(n); 
    this.down=Math.floor(n); 
    this.up2=function(){return Math.ceil(n);} 
} 
var num = new num(4.12); 
alert(num.num); 
alert(num.round); 
alert(num.up); 
alert(num.down); 
alert(num.up2()); 
+0

Возможно, я должен был четко указать, что хочу, чтобы функции .up/.down «после». Первый раунд. Именно по этой причине ваше предложение не будет работать для меня. Кроме того, не то, что вы делаете, просто вычисляете все раз, когда num задано, а затем возвращают статические значения? Я определенно не ищу этого, извините. – Rob

1

Ну вы можете передать параметр в функцию. Не точная реализация, которую вы хотите, просто альтернатива:

var num = function (defaultNumValue) { 
    var delegation = { 
    'up': 'ceil', 
    'down': 'floor' 
    }; 
    return { 
    round: function (val) { 
     return Math[ delegation[val] || 'round' ](defaultNumValue); 
    } 
    } 
}; 

var sth = num(1.5); 
sth.round(); // 2 
sth.round('up'); // 2 
sth.round('down'); // 1 
Смежные вопросы