Javascript继承 - 从另一个原型调用函数

时间:2012-11-07 13:47:32

标签: javascript oop inheritance prototype

  

可能重复:
  Crockford’s Prototypal inheritance - Issues with nested objects

我在使用以下代码从原型A执行原型B中的函数时遇到问题,并且想知道是否有任何简单的解决方案:

var Ob = function () {
  test = 'hi';
}

Ob.prototype.A = {
  that : this,
  root : this,
  goB : function () {
    var that = this;

    console.log('hello');
    that.B.wtf();
  }
}

Ob.prototype.B = {
  that : this,
  root : this,
  wtf : function () {
    var that = this;

    console.log(that);
  }
}

test = new Ob;
test.A.goB();

2 个答案:

答案 0 :(得分:2)

当您将对象文字AB分配给Ob的原型时,您将在原型上放置两个具有某些方法的对象文字。你不是把方法放在原型上。因此,当您在实例test的上下文中对这些对象文字执行该方法时,this并不意味着您认为它意味着什么。

答案 1 :(得分:1)

您需要在创建对象后连接属性:

var Ob = function () {
    var that = this;

    // set the current root to this instance and return the object
    this.getA = function() {
        that.A.currentRoot = that;
        return that.A;
    };

    this.getB = function() {
        that.B.currentRoot = that;
        return that.B;
    };
};

Ob.prototype.A = {
    goB : function () {
        var that = this.currentRoot;

        console.log('hello');
        that.getB().wtf();
    }
};

Ob.prototype.B = {
    wtf : function () {
        var that = this.currentRoot;

        console.log(that, this);
    }
};


test = new Ob;
test.getA().goB();

相当肮脏的黑客是在父对象中使用特权方法来扩充子对象并返回它,以便您可以通过属性访问父对象。脏的部分是,如果您缓存对象,则不保证该属性具有正确的值。所以这或多或少是一种方法,尽管你真的不应该这样做。