javascript作成対象、対象継承のユーティリティ詳細

5653 ワード

ここでは、特別な声明がない場合、属性は属性または方法を指すことを約束します.
オブジェクトの作成、オブジェクトの継承は、実際には同じことです.私たちが必要としている例示的なオブジェクトは、構造関数によってプライベート属性を取得し、プロトタイプチェーンによって共有された属性を取得します.何がいい方法ですか?プライベート属性は構造関数によって取得され(例ではカスタムプライベート属性を考慮しない)、書き換えが必要ではなく、共有属性はプロトタイプチェーンによって発見され、再作成が必要ではない.
ありふれたやり方
コンストラクタモードとプロトタイプモードを使ってオブジェクトを作成します.

function HNU_student(name) {
  this.name = name;
  this.sayName = function() {
    return this.name;
  };
}
HNU_student.prototype = {
  school: 'HNU',
  saySchool: function() {
    return this.school;
  }
};
Object.defineProperty(HNU_student, 'constructor', {value: HNU_student});

var hiyohoo = new HNU_student('xujian');

文面量でprototypeを書き換え、原型のconstructがObjectを指しています.必要な場合はconstructを再定義する必要があります.
寄生ユニット引き継ぎ

function object(o) {
  function F() {};
  F.prototype = o;
  return new F();
}
function inheritPrototype(child, parent) {
  var prototype = object(parent.prototype);
  prototype.constructor = child;
  child.prototype = prototype;
}

function HNU_student(name) {
  this.name = name;
  this.sayName = function() {
    return this.name;
  };
}
HNU_student.prototype.school = 'HNU';
HNU_student.prototype.saySchool = function() {
  return this.school;
};

function Student_2011(name, number) {
  HNU_student.call(this, name);
  this.number = number;
  this.sayNumber = function() {
    return this.number;
  }
}
inheritPrototype(Student_2011, HNU_student);
Student_2011.prototype.graduationTime = 2015;
Student_2011.prototype.sayGraduationTime = function() {
  return this.graduationTime;
};

var hiyohoo = new Student_2011('xujian', 20110803203);

object()の役割:パラメータとして伝来したオブジェクトをインスタンスのプロトタイプにし、このオブジェクトの属性はすべてのインスタンスで共有される.
共有属性:inhertProttype(Student 2011、HNUtudent);サブコンストラクタプロトタイプは超構造関数プロトタイプの一例となり,超構造関数プロトタイプにおける属性はサブコンストラクタに共有される.私有属性:HNU_student.call(this,name);サブコンストラクタによってインスタンスを作成するとき、ハイパーコンストラクタを呼び出してプライベート属性を作成します.
オブジェクトを作成する他の方法
ダイナミックプロトタイプ

function HNU_student(name) {
  this.name = name;
  this.sayName = function() {
    return this.name;
  };

  if (!HNU_student.prototype.school) {
    HNU_student.prototype.school = 'HNU';
    HNU_student.prototype.saySchool = function() {
      return this.school;
    };
  }
}

var hiyohoo = new HNU_student('xujian');

プロトタイプに定義された共有属性をコンストラクタに入れ、判断文を用いてコンストラクタの作成例を初めて呼び出したときにプロトタイプ共有属性を初期化する.
寄生構造関数モード

function SpecialArray() {
  var values = new Array();
  values.push.apply(values, arguments);
  values.toPipedString = function() {
    return this.join('|');
  };

  return values;
}

var colors = new SpecialArray('red', 'black', 'white');

オリジナルのコンストラクタに特殊な属性を追加します.
オブジェクト継承の他の方法
グループ引継ぎ

function HNU_student(name) {
  this.name = name;
  this.sayName = function() {
    return this.name;
  };
}
HNU_student.prototype.school = 'HNU';
HNU_student.prototype.saySchool = function() {
  return this.school;
};
function Student_2011(name, number) {
  HNU_student.call(this, name);
  this.number = number;
  this.sayNumber = function() {
    return this.number;
  };
}
Student_2011.prototype = new HNU_student();
Student_2011.prototype.constructor = Student_2011;
Student_2011.prototype.graduationTime = 2015;
Student_2011.prototype.sayGraduationTime = function() {
  return this.graduationTime;
}
var hiyohoo = new Student_2011('xujian', 20110803203);
共有属性:Student_2011.prototype=new HNU_student();サブ構造関数のプロトタイプは超構造関数のプロトタイプを指し、例はプロトタイプチェーンによって共有されたすべての属性を見つけた.私有属性:HNU_student.call(this,name);サブコンストラクタによってインスタンスを作成するとき、ハイパーコンストラクタを呼び出してプライベート属性を作成します.
欠陥:超構造関数を二回呼び出した.Student_2011.prototype=new HNU_student();一方、サブコンストラクタプロトタイプにおいて、メタコンストラクタによって定義されたプライベート属性が作成され、これらのプロトタイプの私有属性はインスタンス中の同名の属性によって覆い隠されている.
プロトタイプ継承、寄生式継承

function object(o) {
  function F() {}
  F.prototype = o;
  return new F();
}
var student1 = {
  school: 'HNU',
  saySchool: function() {
    return this.school;
  }
};
var student2 = object(student1);
Object.creat()はECMAScript 5によって追加された方法で、二つのパラメータを受け入れる.一つは元のオブジェクトとして、もう一つは属性を書き換えたり追加したりするオブジェクトで、作用はカスタムのobject()と同じである.

var student1 = {
  name: 'xujian',
  school: 'HNU'
};
var student2 = Object.create(student1, {
  name: {
    value: 'huangjing'
  }
});
寄生式継承はプロトタイプ継承に基づいて追加的な属性を付加してオブジェクトを強化した.

function object(o) {
  function F() {}
  F.prototype = o;
  return new F();
}
function creatAnother(original) {
  var clone = object(original);
  clone.sayHi = function() {
    alert('Hi!');
  };
  return clone;
}
var student1 = {
  school: 'HNU',
  saySchool: function() {
    return this.school;
  }
};
var student2 = creatAnother(student1);
プロトタイプ継承および寄生式継承は、既存のオブジェクトと同様のインスタンスオブジェクトを作成するために使用されます.