1

我正在尝试覆盖对象的方法,但仍使用Object.getPrototypeOf(). 这在第一次时效果很好,但是如果该方法被多次覆盖,则会出现问题。

此代码导致堆栈溢出:

A =
{
   blurg: function()
   {
      puts('hey there')
   }
}

B = (function buildB(){
   var obj = Object.create(A)

   obj.blurg = function()
   {
      Object.getPrototypeOf(this).blurg.apply(this, arguments)

      puts('hai!!!!')
   }

   return obj
})()

b = (function buildb(){
   var obj = Object.create(B)

   obj.blurg = function()
   {
      Object.getPrototypeOf(this).blurg.apply(this, arguments)

      puts('bye bye')
   }

   return obj
})()


b.blurg()

jsFiddle

问题是我想用当前对象调用原型的方法this。当该方法执行相同操作时,这会导致问题。

我会以错误的方式解决这个问题吗?有没有办法创建一个辅助函数来确保正确的原型被拉起?我有点不知所措。

4

1 回答 1

3

问题是,在 JavaScript 中,本质上this总是指代原型链中自下而上的对象实例,因此当您在像上面这样的层次结构中覆盖方法时,this.prototype.someMethod()指的是对象实例的确切基类,它不会当您最多有两级层次结构时似乎是一个问题,但是当您定义三级或更多层次结构时,递归是不可避免的!就是这样:

A: grand super class
B: super class - inherits from A (B.prototype = A)
C: class - inherits from B (C.prototype = B)

a: instance of A (defines someMethod)
b: instance of B (defines someMethod, calls A.someMethod through Object.getPrototypeOf(this))
c: instance of C (defines someMethod, calls B.someMethod through Object.getPrototypeOf(this))

被调用时b.someMethod,可以成功调用A的someMethod(Object.getPrototypeOf(this)被b调用时返回A)

然而,当c.someMethod被调用时,它首先调用b.someMethod,然后调用,b.someMethod因为Object.getPrototypeOf(this)当被 c 调用时总是返回 B!这就是发生堆栈溢出的地方。

要解决此问题,请尝试在定义新子类时存储基类引用,避免this在调用超类方法时使用:

A =
{
    blurg: function () {
        console.log('hey there')
    }
};

B = (function buildB() {
    var obj = Object.create(A);
    var base = Object.getPrototypeOf(obj);

    obj.blurg = function () {
        base.blurg.apply(this, arguments);
        console.log('hai!!!!')
    }

    return obj
})();

C = (function buildb() {
    var obj = Object.create(B);
    var base = Object.getPrototypeOf(obj);

    obj.blurg = function () {
        base.blurg.apply(this, arguments);
        console.log('bye bye');
    }

    return obj
})();

C.blurg();
于 2012-05-14T19:04:59.677 回答