0

我有一个像这样定义的抽象对象......

var abs = module.exports = function abs(val){

   if(!(this instanceof abs)){

      return new abs(val);

   }

   abs.prototype.getName = function getName(){

      return val.name;

   }

}

和一个我想从它继承的具体类,定义如下......

 var concrete = module.exports = function concrete(val){

    var abs = require('./abs');

    if(!(this instanceof concrete)){

       return new concrete(val);

    }

    concrete.prototype = Object.create(abs.prototype);

 }

当我写...

 var anObject { name : "John" };
 var concreteObject = new concrete(anObject);
 concrete.getName();

我收到以下错误..

TypeError: Object #<conrete> has no method 'getName'

我究竟做错了什么?

4

1 回答 1

1

=您所写的内容中有两个错误(仅剩下缺少的):

  • concrete.getName()不起作用,因为concrete是您的构造函数。它没有这种方法。
  • concreteObject.getName()不起作用,因为它的原型没有这样的方法。concrete.prototype 您确实在构造函数中进行了覆盖,但是该实例已经使用旧实例构建了。检查操作new员的工作方式

因此,您还需要修复这些类定义。正如我们所见,不能从共享原型函数访问构造函数参数——这没有任何意义。并且在构造函数中分配原型方法将使所有实例都可以使用val最新的调用。abs啊。

使用原型:

function abs(val) {
    if (!(this instanceof abs))
        return new abs(val);

    this.val = val;
}
abs.prototype.getName = function getName(){
    return this.val.name;
};
module.exports = abs;

或使用特权实例方法(请参阅Javascript:我需要为对象中的每个变量放置 this.var 吗?解释):

function abs(val){
    if (!(this instanceof abs))
        return new abs(val);

    this.getName = function getName(){
       return val.name;
    };
}
module.exports = abs;

至于那个concrete东西,我完全不明白你为什么需要它——它似乎并没有比它做的更多concrete = abs;。但是,继承的蓝图如下所示:

var abs = require('./abs');
function concrete(val){
    if (!(this instanceof concrete))
        return new concrete(val);

    abs.call(this, val);
}
concrete.prototype = Object.create(abs.prototype);
于 2013-09-19T23:52:27.610 回答