JSで継承を実現するいくつかの方法をまとめました.
4267 ワード
一つ.二つのオブジェクトの間の継承
Object.set ProttypeOf(子オブジェクト、親オブジェクト)
構造関数の原型オブジェクトを置換し、新しい親オブジェクトとします. 結果:将来作成するサブオブジェクトは、新規に作成したすべてのサブオブジェクトが新しい親のオブジェクトを継承します. タイミング:コンストラクタを定義した直後に修正します. 元のプロジェクトのオブジェクトを変更する前に、新しいサブオブジェクトを作成する前に ステップ:1.構造関数.prototype=新しい親オブジェクト 2.コンストラクタ.prototype.com nstructor=コンストラクタオブジェクト
この方法はオブジェクトを作成する前にのみ有効です.
var son=Object.create(親対象、
{
拡張属性名1:{writable:true,value:属性値,
configrable:true
}
拡張属性名2:{…}
});
いつ使用しますか?二つのタイプの間の継承
1.サブタイプのコンストラクタの開始位置は、親タイプのコンストラクタを借りる: 父のタイプのコンストラクション.call(this、パラメータリスト) 父のタイプのコンストラクタ.appy(this,[パラメータリスト]) 強調:第一歩だけを完成して、ただ構造関数の文を借りるだけです. オブジェクト間の継承は実現されていません.
function sub(){
スーパー.call
subの拡張属性
)
2.コンストラクタを定義した後、サブタイプのコンストラクタを設定するプロトタイプは、親タイプのプロトタイプを継承するタイプです.
Object.set ProttypeOf(sub.prototype、parent.prototype)
Appleの例:
Object.set ProttypeOf(子オブジェクト、親オブジェクト)
var father={balance:10000000000,car:"=B="};
function Student(sname,sage){//this-->
this.sname=sname;
this.sage=sage;
}
var lilei=new Student("Li Lei",18);
var hmm=new Student("Han Meimei",19);
/* */
//hmm.__proto__=father;
Object.setPrototypeOf(hmm,father);
console.log(hmm.balance); //1000.....
二.コンストラクタの原型オブジェクトを変更する------コンストラクタ.Prottype=父オブジェクト構造関数の原型オブジェクトを置換し、新しい親オブジェクトとします. 結果:将来作成するサブオブジェクトは、新規に作成したすべてのサブオブジェクトが新しい親のオブジェクトを継承します. タイミング:コンストラクタを定義した直後に修正します. 元のプロジェクトのオブジェクトを変更する前に、新しいサブオブジェクトを作成する前に ステップ:1.構造関数.prototype=新しい親オブジェクト 2.コンストラクタ.prototype.com nstructor=コンストラクタオブジェクト
この方法はオブジェクトを作成する前にのみ有効です.
var father={balance:10000000000,car:"=B="};
function Student(sname,sage){//this-->
this.sname=sname;
this.sage=sage;
}//prototype-->Student.prototype
Student.prototype=father;
Student.prototype.constructor=Student;
//prototype-->father
// ,
Student.prototype.intrSelf=function(){
console.log("I'm "+this.sname+",I'm "+this.sage);
}//prototype.intrSelf
//father.intrSelf
var lilei=new Student("Li Lei",18);
var hmm=new Student("Han Meimei",19);
/* */
//hmm.__proto__=father;
//Object.setPrototypeOf(hmm,father);
console.log(hmm.balance); //1000.....
console.log(lilei.balance);//1000.....
lilei.intrSelf();
hmm.intrSelf();
三. 既存の親オブジェクトを参照して、新しいサブオブジェクトを作成します.また、拡張子オブジェクトには属性があります. var son=Object.create(父の対象) 2つのこと:1.空のオブジェクトを作成するson 2.ソニのウウウを設置するプロト.親のオブジェクトを指しますvar son=Object.create(親対象、
{
拡張属性名1:{writable:true,value:属性値,
configrable:true
}
拡張属性名2:{…}
});
var father={balance:10000000000,car:"=B="};
var son=Object.create(father,{
favorite:{value:" "/*,writable:true*/}
});
console.log(son.balance);
console.log(son.favorite);
console.log(son.hasOwnProperty("favorite"));//true
son.favorite=" ";
console.log(son.favorite);
四.構造を継承しつつ、原型を継承する:――推奨の継承方式いつ使用しますか?二つのタイプの間の継承
1.サブタイプのコンストラクタの開始位置は、親タイプのコンストラクタを借りる: 父のタイプのコンストラクション.call(this、パラメータリスト) 父のタイプのコンストラクタ.appy(this,[パラメータリスト]) 強調:第一歩だけを完成して、ただ構造関数の文を借りるだけです. オブジェクト間の継承は実現されていません.
function sub(){
スーパー.call
subの拡張属性
)
2.コンストラクタを定義した後、サブタイプのコンストラクタを設定するプロトタイプは、親タイプのプロトタイプを継承するタイプです.
Object.set ProttypeOf(sub.prototype、parent.prototype)
Appleの例:
1
2 /* */
3 function Person(name,age)
4 {
5 this.name=name;
6 this.age=age;
7 }
8 /* */
9 function Student(name,age,grade)
10 {
Person.call(this,name,age);
11 // Person.apply(this,arguments);
12 this.grade=grade;
13 }
14 //
15 var student=new Student("qian",21," ");
16 //
17 alert("name:"+student.name+"
"+"age:"+student.age+"
"+"grade:"+student.grade);
18 // name: qian age:21 grade:
19 // name age , , apply .
20
/* */
function Flyer(fname,speed){
this.fname=fname; this.speed=speed;
}
Flyer.prototype.fly=function(){//
console.log(this.fname+" "+this.speed+" ");
}
var bird=new Flyer(" ",60);
bird.fly();
/* : , , */
function Plane(fname,speed,capacity){
Flyer.call(this,fname,speed);//——
this.capacity=capacity;
}//Plane.prototype Flyer.prototype
Object.setPrototypeOf(Plane.prototype,Flyer.prototype);
Plane.prototype.fly=function(){
console.log(this.fname+" "+
this.capacity+" "+
this.speed+" ");
}
var A380=new Plane("A380",1000,555);
A380.fly();//?