プロトタイプ&プロトタイプ引継ぎ

20430 ワード

クローンの原型モードを使う
デザインモードから言えば、プロトタイプはオブジェクトを作成するためのモードです.オブジェクトを作成する場合、まずタイプを指定して、クラスを通してこのオブジェクトを作成します.プロトタイプモードは、別の方法を選択して、対象の具体的なタイプに関心を持たず、クローンによって同じオブジェクトを作成します.
プロトタイプの実現の鍵は、言語そのものがclone方法を提供しているかどうかです.ECMAScript 5はObject.create方法を提供しており、対象をクローンすることができます.
var Plane = function(){
	this.blood = 100;
	this.attackLevel = 1;
	this.defenseLevel = 1;
}
var plane = new Plane();
plane.blood = 500;
plane.attackLevel = 10;
plane.defenseLevel = 7;
var clonePlane = Object.create(plane);
console.log(clonePlane); //  :Object{blood: 500, attackLevel: 10, defenseLevel: 7}

//    Object.create        ,         :
Object.create = Object.create || function(obj) {
	var F = function(){};
	F.prototype = obj;
	return new F();
}
JavaScriptの原型継承
1、すべての対象はObject.prototypeオブジェクトからクローンされています.
var obj1 = new Object();
var obj2 = {};
Object.getPrototypeOf(obj1) === Object.prototype;// true
Object.getPrototypeOf(obj2) === Object.prototype;// true
2、オブジェクトを得るには、インスタンスクラスではなく、オブジェクトを見つけてプロトタイプとしてクローンします.
JavaScriptでは、クローンの詳細については、内部エンジンの責任で実現する必要はありません.私たちはvar obj 1=new Object()またはvar obj 2={}を表示する.この時エンジン内部はObject.prototypeの上から一つのオブジェクトをクローンします.私達が最終的に得たのはこの対象です.
newオペレータを使ってコンストラクタからオブジェクトを一つ獲得します.
function Person(name){
	this.name = name;
};
Person.prototype.getName = function(){
	return this.name;
};
var a = new Person('zee');
console.log(a.name);//zee
console.log(a.getName());//zee
console.log(Object.getProttotypeOf(a) === Person.prototype);//true
new演算子でオブジェクトを作成するプロセスは、Object.prototypeオブジェクトを最初にクローンするだけです.
new演算のプロセス:
function Person(name){
	this.name = name;
};
Person.prototype.getName = function(){
	return this.name;
};
var objectFactory = function(){
	var obj = new Object(), //  Object.protoype         
		Constructor = [].shift.call(arguments);//          ,   Person
		obj.__proto__ = Constructor.prototype; //        
		var ret = Constructor.apply(obj, arguments); //           obj    
		return typeof ret === 'object' ? ret : obj; //               
};
var a = objectFactory(Person, 'zee');
console.log(a.name);//zee
console.log(a.getName());//zee
console.log(Object.getProttotypeOf(a) === Person.prototype);//true
------------------------------------------------------------------
var a = objectFactory(A, 'zee');
var a = new A('zee');
3、相手は彼の原型を覚えています.
var a = new Object();
console.log(a.__proto__ === Object.prototype);
実際の__proto__は、オブジェクトと「オブジェクトコンストラクタの原型」を結ぶ紐です.オブジェクトは__proto__属性によって、そのアーキテクチャのプロトタイプを覚えているからです.
4、オブジェクトがある要求に応答できない場合、この要求をそのコンストラクタのプロトタイプに委託します.
var obj = {name:'zee'};
var A = function(){};
A.prototype = obj;
var a = new A();
console.log(a.name);// zee
(1)まず、オブジェクトaのすべての属性を遍歴してみたが、nameという属性は見つからなかった.(2)name属性を検索するこの要求は、オブジェクトaのコンストラクタのプロトタイプに委託され、a.__proto__によって記録され、A.prototypeに向けられ、A.prototypeはオブジェクトobjに設定される.(3)オブジェクトobjでname属性を見つけ、その値を返します.
ES 6プロトタイプ引継ぎ
class Animal {
	constructor(name){
		this.name = name;
	}
	getName(){
		return this.name;
	}
}
class Dog extends Animal {
	constructor(name){
		super(name);
	}
	speak(){
		return 'woof';
	}
}
var dog = new Dog('Scamp');
console.log(dog.getName() + 'says' + dog.speak());