JavaScript Prototypal Inheritance - 这是正确的做事方式吗?

时间:2012-02-09 19:39:38

标签: javascript class inheritance prototype instantiation

如果我在一个对象的构造函数之外声明基本原型对象,那么所有创建的对象都基于那个不适合我需要的单个基础对象,因为我需要多个基础对象的实例。

简而言之:这段代码是否正确?它有效,但我对于拥有正确的代码非常挑剔。

示例:

function BaseObject()
{
    BaseObject.prototype.insertObject = function()…
    …
    … // Some other functions.
}

function Object1()
{
    Object1.prototype = new BaseObject();

    Object1.prototype.coolFunction = function()…
    …
    … // Same kind of pattern.
}

function Object2()
{
    Object2.prototype = new Object1();

    Object2.prototype.incredibleFunction = function()…
    …
    … // You get the idea.
}

2 个答案:

答案 0 :(得分:0)

不,当前在构造函数中的所有代码都应该在它们之外。现在,每当有人创建新对象时,您都会重新分配原型的这些属性。

最后,良好实践要点:

  • 您应该始终“修复”任何派生原型的constructor属性。这是JS继承的一个怪癖;它被覆盖了。人们很少依赖constructor属性是正确的,但有时他们会这样做,如果你不这样做,那就错了。
  • 如果您使用支持它的浏览器或使用es5-shim,则
  • Object.create(Base.prototype)优于new Base()。它只是实例化对象,而不是创建它,这很好,因为你不需要对象的实际副本来执行原型继承。

这看起来都像:

function BaseObject() { }

BaseObject.prototype.insertObject = function () { };

function Object1() { }

Object1.prototype = Object.create(BaseObject.prototype);
Object1.prototype.constructor = Object1;
Object1.prototype.coolFunction = function () { };

function Object2() { }

Object2.prototype = Object.create(Object1.prototype);
Object2.prototype.constructor = Object2;
Object2.prototype.incredibleFunction = function () { };

答案 1 :(得分:0)

一般模式:

function Base ( baseMember ) {
    this.baseMember = baseMember;
}

Base.prototype.baseFunc = function () {};

function Derived ( baseMember, derivedMember ) {
    Base.apply( this, arguments );   
    this.derivedMember = derivedMember;
}

Derived.prototype = Object.create( Base.prototype );
Derived.prototype.constructor = Derived;

Derived.prototype.derivedFunc = function () {};

这很难看,我知道......