2012-02-09 84 views
0

如果我在对象的构造函数外声明基础原型对象,则所有创建的对象都基于该单个基础对象,这不适合我的需要,因为我需要基础对象的多个实例。JavaScript原型继承 - 这是做事的正确方式吗?

总之:这段代码是否正确?它的工作原理,但我很挑剔有正确的代码。

例子:

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. 
} 

回答

0

没有,所有这些都是目前里面你的构造函数的代码应该是他们之外。现在,每当有人创建新对象时,您都将重新分配原型的这些属性。

最后,良好做法的要点:

  • 你总是要“修正”任何派生原型constructor财产。这是JS继承的怪癖;它会被覆盖。人们很少依赖constructor属性是正确的,但有时他们会这样做,如果不这样做,就会感觉错误。
  • Object.create(Base.prototype)new Base()更好,如果您在支持它的浏览器中工作或使用es5-shim。它只是实例化对象,而不是创建它,这很好,因为您不需要实际的对象副本来执行原型继承。

这一切看起来像:

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() { }; 
+0

如果我做'Object1.prototype =新BaseObject();'在构造函数之外,从Object1创建的每个对象都依赖于BaseObject的单个实例。我需要一种方法来创建BaseObject的新实例。 – user1092719 2012-02-09 19:46:18

+0

即使您在构造函数中执行它,情况依然如此。 'Object1'的每个实例都共享Object1.prototype,因此每次重新分配Object1时,所做的每件事情都是使每个Object1实例都依赖于同一个新构建的原型BaseObject。 – Domenic 2012-02-09 19:48:20

+0

但是,当我在我的实际代码中这样做时,它的工作原理与我需要的一样,因为每次构造函数被调用时,都会将该对象上的原型设置为“BaseObject”的新创建实例,然后重复该模式并它工作正常。有一个干净和正确的方法来做到这一点。 – user1092719 2012-02-09 19:56:11

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() {}; 

这是丑陋的,我知道......