Обновление на основе вашего комментария:
MainFnc
- это объект, который создается в переменной (то есть MainVar
).Так что, если бы я хотел попробовать MainVar.subFnc(2)
, он бы вернул 4
.Однако, если бы я хотел попробовать MainVar.subFnc(2).subSubFnc(2)
, он бы возвратил 8
.
Прямо сейчас вы возвращаете число из вашего subFnc
, и поэтому выражение MainVar.subFnc(2).subSubFnc(2)
ломается так:
- Поиск свойства
subFnc
на MainVar
;возвращает ссылку на функцию. - Вызовите функцию с помощью
this
= MainVar
;это возвращает число 2
. - Найдите свойство
subSubFnc
по номеру 2
;возвращает undefined
. - Вызовите функцию с помощью
this
= 2
;не удается, потому что вы не можете вызвать undefined
как функцию.
Подробнее: Вы должны запомнить this
и Мифические методы
Чтобы сделать то, что вы делаете, вам нужно будет subFnc
вернуть объект со свойствами функции.Вы можете сделать это следующим образом:
function MainFnc(val) {
this.value = val;
this.mult=function(a) {
return new MainFnc(this.value * a);
};
this.div=function(a) {
return new MainFnc(this.value / a);
};
this.get = function() {
return this.value;
};
}
... и затем назвать его так:
var MainVar = new MainFnc(3);
alert(MainVar.mult(3).mult(4).div(6).get()); // alerts "6" (3 * 3 * 4 / 6 = 6)
Живой пример
Примечаниефункция get
для возврата основного числа.Вы также можете добавить toString
:
this.toString = function() {
return String(this.value);
};
Но вышеупомянутое не использует преимущества прототипного наследования вообще (и будет важно, если вы создаете все эти объекты; мынужно держать их легкими);вы можете подумать:
function MainFnc(val) {
this.value = val;
}
MainFnc.prototype.mult = function(a) {
return new MainFnc(this.value * a);
};
MainFnc.prototype.div = function(a) {
return new MainFnc(this.value / a);
};
MainFnc.prototype.get = function() {
return this.value;
};
MainFnc.prototype.toString = function() {
return String(this.value);
};
Оригинальный ответ :
С этим кодом, если вы сделали это:
var f = new MainFnc();
alert(f.subFnc(3)); // alerts "6"
alert(f.subFnc.subSubFnc(3)); // NaN
...because this
внутри subSubFnc
, когда вызывается так, как subFnc
, и умножение ссылки на функцию пытается преобразовать ее в число, которое получается NaN
, и поэтому результат умножения равен NaN
.
Помните, что в JavaScript this
полностью определяется , как функция вызывается , а не , где функция определяется .Когда вы вызываете функцию с помощью точечной нотации (a.b();
), объект, для которого вы ищите свойство, становится this
в вызове функции, и поэтому a.b.c();
, this
в c()
равно b
, не a
.Подробнее: Вы должны запомнить this
и Мифические методы