JAvascript継承の実装(二)


prototype継承はサブクラスのプロトタイプオブジェクトを(prototype)親クラスの一例として継承するように設定されています.このように継承を簡単に設定するのは確かにスレ主が言ったように、多くの欠点があります.総じて4つの欠点があります.欠点1:親クラスの構造関数はJAVAのように子クラスをインスタンス化するときに実行されるのではなく、継承を設定するときに実行され、一度だけ実行されるということです.これは往々にして私ではありません特に親クラスの構造関数にいくつかの特殊な操作がある場合に望んでいます.欠点2:親クラスのコンストラクション関数は、子クラスがインスタンス化されたときに実行されないため、親クラスのコンストラクション関数に設定されたメンバー変数は、子クラスに設定されると、すべてのインスタンスオブジェクトに共通の変数になります.JavaScriptでは「取得」属性の値のみが継承されているため、属性の値がString、Number、Booleanなどのデータ自体が変更できないタイプの場合は影響しません.ただし、ArrayとObjectタイプに問題があります.欠点3:親クラスの構造関数にパラメータが必要な場合は、仕方がありません.欠点4:サブクラスの元のプロトタイプオブジェクトが置き換えられ、サブクラス自体のconstructor属性がなくなります.クラスのインスタンスでconstructorプロパティを取得すると、親から継承されたconstructorプロパティが取得され、constructorの値は子ではなく親です.私もこの4つの欠点のために頭を悩ませたことがあるので、prototypeの継承を改造しました.いくつかの方法を試してみましたが、次は一番いいと思います.私はそれをFunctionオブジェクトの1つの方法に書いて、このように使う時便利です.方法は次のとおりです.
//    -   
Function.prototype.Extends = function (parentClass)
{
  var Bs = new Function();
  Bs.prototype = parentClass.prototype;
  this.prototype = new Bs();
  this.prototype.Super = parentClass;
  this.prototype.constructor = this;
}
 
prototype.jsの実装:
Object.extend=function(destination,source){
  for(property in source)
  {
  destination[property]=source[property];
  }
  return destination;
}

Object.prototype.extend=function(object){
  alert("Object.prototype.extend");
  return Object.extend.apply(this,[this,object]);
}

function class1(){
}

class1.prototype={
  method:function(){
  alert("class1.method!");
  },
  method2:function(){
  alert("class1.method2!");
  }
};

function class2(){
   
}

class2.prototype=(new class1()).extend(
  {
  method3:function(){
  alert("class2.method!");
  }
  }
);