0

可能重复:
Crockford 的原型继承 - 嵌套对象的问题

我在获取以下代码以从原型 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();
4

2 回答 2

2

当您将对象字面量A和分配B给 的原型时Ob,您就是在原型上放置了两个带有一些方法的对象字面量。您没有将方法放在原型上。因此,当您在实例的上下文中对这些对象文字执行该方法时testthis并不意味着您认为它意味着什么。

于 2012-11-07T13:55:22.527 回答
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();

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

于 2012-11-07T13:57:23.863 回答