Прототипы объектов внутри объектов - PullRequest
0 голосов
/ 10 мая 2011

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

function MainFnc() {
    this.subFnc=function(a) {
        return a*2
    }
    this.subFnc.subSubFnc=function(a) {
        return this*a
    }
}

Это не мой настоящий код - это гораздо лучшая причина, чем умножение чисел. Это просто упрощенный пример того, чего я пытаюсь достичь. Мой вопрос заключается в том, возможно ли на самом деле зайти так глубоко, и если да, то как? Метод, который я описал в этом примере кода, очевидно, не работает.

Спасибо за любую помощь.

Изменить: Вот пример его использования, так как не все четко понимают, что я хочу сделать с этим:

anObject=new MainFnc;
alert(anObject.subFnc(2)); //returns 4
alert(anObject.subFnc(2).subSubFnc(2); //returns 8

Это , а не , в точности то, что я делаю, просто проще понять с помощью простого умножения.

Ответы [ 2 ]

2 голосов
/ 10 мая 2011

Это как можно ближе:

function foo(n){
    this.value = n;

    return this;
};

foo.prototype = {
    valueOf : function(){
        return this.value;
    },
    multiplyBy : function(n){
        return new foo(this.value * n);
    }
};

foo.prototype.toString = foo.prototype.valueOf;

var x = new foo(2);
var y = x.multiplyBy(2).multiplyBy(2).multiplyBy(2);

// y == 16
1 голос
/ 10 мая 2011

Обновление на основе вашего комментария:

MainFnc - это объект, который создается в переменной (то есть MainVar).Так что, если бы я хотел попробовать MainVar.subFnc(2), он бы вернул 4.Однако, если бы я хотел попробовать MainVar.subFnc(2).subSubFnc(2), он бы возвратил 8.

Прямо сейчас вы возвращаете число из вашего subFnc, и поэтому выражение MainVar.subFnc(2).subSubFnc(2)ломается так:

  1. Поиск свойства subFnc на MainVar;возвращает ссылку на функцию.
  2. Вызовите функцию с помощью this = MainVar;это возвращает число 2.
  3. Найдите свойство subSubFnc по номеру 2;возвращает undefined.
  4. Вызовите функцию с помощью 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 и Мифические методы

...