js継承方式

21628 ワード

1.プロトタイプチェーン継承
function A(firstName){
	this.firstName=firstName		
}
A.prototype.getFirstName=function(){
	console.log(this.firstName);
}
function B(lastName){
	this.lastName=lastName;
}
B.prototype=new A(" ");
B.prototype.getLastName=function(){
	console.log(this.lastName);
}
var person=new B(" ");
person.getFirstName();
person.getLastName();
欠点:すべての参照タイプのプロトタイプの属性はすべてのインスタンスに共有されるので、すべてのオブジェクトインスタンスに影響を与えない場合、親タイプの構造関数にパラメータを伝達することはできない.2.構造関数を使って継承する
function A(firstName){
	this.firstName=firstName		
}
function B(lastName){
	A.call(this," ");
	this.lastName=lastName;
}
var person=new B(" ");
console.log(person.firstName);
console.log(person.lastName);
短所:親の方法は3つ以上作成されます.組み合わせ相続(プロトタイプチェーンと借用構造関数の組み合わせ)
function A(firstName){
	this.firstName=firstName		
}
A.prototype.getFirstName=function(){
	console.log(this.firstName);
}
function B(firstName,lastName){
	A.call(this,firstName)
	this.lastName=lastName;
}
B.prototype=new A();
A.prototype.constructor=B;
B.prototype.getLastName=function(){
	console.log(this.lastName);
}
var person=new B(" "," ");
person.getFirstName();
person.getLastName();
ポートフォリオ継承の欠点:親のコンストラクタが2回呼び出された4.寄生式継承
function A(original){
	var clone=Object(original);
	clone.getName=function(){
		console.log(this.name);
	}
	return clone;
}
var person={
	name:"  ",
};
var B=A(person);
B.getName();
5.寄生結合式継承
function object(o){
	function F(){}
	F.prototype=o;
	return new F();
}
function inheritPrototype(B,A){
	var prototype=object(A.prototype);
	prototype.constructor=B;
	B.prototype=prototype
}
function A(firstName){
	this.firstName=firstName		
}
A.prototype.getFirstName=function(){
	console.log(this.firstName);
}
function B(firstName,lastName){
	A.call(this,firstName)
	this.lastName=lastName;
}
inheritPrototype(B,A);
B.prototype.getLastName=function(){
	console.log(this.lastName);
}
var person=new B(" "," ");
person.getFirstName();
person.getLastName();
6.クラス引継ぎ
class A{
	constructor(x,y){
		this.x=x;
		this.y=y;
	}
	print(){
		console.log(this.x)
	}
}
class B extends A{
	constructor(x,y,z){
		super(x,y);
		this.z=z;
	}
	m(){
		super.print();
	}
}
let num=new B(1,2,3);
num.m();//1
console.log(num instanceof A); //true
console.log(num instanceof B); //true
super()方法はここでA.prototype.com nstructor.callに相当します.関数としては、super()は、サブクラスのコンストラクタの中だけで、他の場所でsuperをオブジェクトとして誤報する場合、普通の方法では親タイプのプロトタイプオブジェクトを指し、静的な方法では親類を指す.