对象内对象的原型

时间:2011-05-10 03:06:29

标签: javascript function prototype this

我正在尝试创建一个可以应用于函数内另一个函数返回的值的函数。由于这可能是一个可怕的解释,这里有一个简化的样本:

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 个答案:

答案 0 :(得分:2)

这是尽可能接近:

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 :(得分:1)

根据您的评论

更新

  

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作为函数调用。
  5. 更多:You must remember thisMythical Methods

    要做你正在做的事情,你必须让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)
    

    Live example

    注意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
    

    ...因为this内部subSubFnc被调用时subFnc,并且函数引用的倍增会尝试将其转换为数字NaN ,因此乘法的结果是NaN

    请记住,在JavaScript中,this完全由如何调用函数定义,而不是定义函数。当您通过点符号(a.b();)调用函数时,您正在查找属性的对象在函数调用中变为this,因此使用a.b.c();,{{1} } this内的c()b,而不是a。更多:You must remember thisMythical Methods

相关问题