【问题标题】:Javascript inherited class constructor issueJavascript继承类构造函数问题
【发布时间】:2017-02-25 09:50:31
【问题描述】:

我想使用 javascript 中的原型从超类创建一个子类,所以我设置了它们:

var SuperClass = function() {
    this.a = 1;
    this.get = function() {return this.a;}
    this.init = function() {
        CreateStrangeThings();
    }
    this.init();
}
var SubClass = function() {
    this.b = 2;
    this.get = function() {return this.b;}
}
SubClass.prototype = new SuperClass();

问题是,SubClass.prototype = new SuperClass(); 行调用了CreateStrangeThings(); 函数。我希望仅在我创建子类对象 (var subOjbect = new SubClass();)

时调用此函数

如何解决这个问题?也许我应该使用 SubClass.prototype = SuperClass; ?明智吗?

编辑:

SubClass.prototype = SuperClass;

从子类中删除“a”属性

【问题讨论】:

  • 那么为什么不在SubClass 构造函数中包含CreateStrangeThings() 函数呢?
  • "CreateStrangeThings()" 必须在我的应用程序设计中的每个基类中启动,并且不应在编码中重复(真正的 OOP)
  • SubClass.prototype = SuperClass 只会使您的 SubClass.prototype 成为一个函数。避免这种情况。还要注意您在原型链中隐藏了您的get 函数,该函数预计将由返回this.b 的实例化对象中的get 函数返回this.a。此外,CreateStrangeThings() 究竟做了什么……?
  • 在设置基类时不应该做的事情。 (它创建图形)
  • 顺便说一句,您不应该使用从构造函数调用的 init 方法。而是将代码直接放在构造函数中。

标签: javascript inheritance constructor prototype


【解决方案1】:

问题是,SubClass.prototype = new SuperClass(); 行调用了CreateStrangeThings(); 函数。

是的。这就是为什么这种模式尽管经常被引用,但却是错误的。另一个原因是它忽略了超类构造函数可能需要参数的可能性。

相反,创建原型对象而不调用超级构造函数:

SubClass.prototype = Object.create(SuperClass.prototype);
SubClass.prototype.constructor = SubClass;

...并且还调用了SubClass内部的超级构造函数:

var SubClass = function() {
    SuperClass.call(this);
    this.b = 2;
    this.get = function() {return this.b;}
};

所以我们一起得到:

var SuperClass = function() {
    this.a = 1;
    this.get = function() {return this.a;}
    this.init = function() {
        CreateStrangeThings();
    }
    this.init();
};
var SubClass = function() {
    SuperClass.call(this);
    this.b = 2;
    this.get = function() {return this.b;}
};
SubClass.prototype = Object.create(SuperClass.prototype);
SubClass.prototype.constructor = SubClass;

当然,也可以使用 ES2015 和转译器。

class SuperClass {
    constructor() {
        this.a = 1;
        this.get = function() {return this.a;};
        this.init = function() {
            CreateStrangeThings();
        };
        this.init();
    }
}
class SubClass {
    constructor() {
        super();
        this.b = 2;
        this.get = function() {return this.b;};
    }
}

如何解决这个问题?也许我应该使用 SubClass.prototype = SuperClass; ?明智吗?

没有。如果希望通过new SubClass 创建的对象从SuperClass.prototype 继承属性,则需要SubClass.prototype 使用SuperClass.prototype 作为其原型。 SuperClass 没有; SuperClass 的原型是 Function.prototype,而不是 SubClass.prototype。 (忽略函数上 prototype 属性的名称;它不是它们的原型,而是 new 分配给通过 new TheFunction 创建的对象的原型。)

【讨论】:

  • @marirena:是的,这是错误的。我在上面的末尾添加了一条注释。
猜你喜欢
  • 1970-01-01
  • 2021-06-24
  • 1970-01-01
  • 1970-01-01
  • 2013-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多