可能重复:
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();
答案 0 :(得分:2)
当您将对象文字A
和B
分配给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();
相当肮脏的黑客是在父对象中使用特权方法来扩充子对象并返回它,以便您可以通过属性访问父对象。脏的部分是,如果您缓存对象,则不保证该属性具有正确的值。所以这或多或少是一种方法,尽管你真的不应该这样做。