プロトタイプ&プロトタイプ引継ぎ
20430 ワード
クローンの原型モードを使う
デザインモードから言えば、プロトタイプはオブジェクトを作成するためのモードです.オブジェクトを作成する場合、まずタイプを指定して、クラスを通してこのオブジェクトを作成します.プロトタイプモードは、別の方法を選択して、対象の具体的なタイプに関心を持たず、クローンによって同じオブジェクトを作成します.
プロトタイプの実現の鍵は、言語そのものがclone方法を提供しているかどうかです.ECMAScript 5はObject.create方法を提供しており、対象をクローンすることができます.
1、すべての対象はObject.prototypeオブジェクトからクローンされています.
JavaScriptでは、クローンの詳細については、内部エンジンの責任で実現する必要はありません.私たちはvar obj 1=new Object()またはvar obj 2={}を表示する.この時エンジン内部はObject.prototypeの上から一つのオブジェクトをクローンします.私達が最終的に得たのはこの対象です.
newオペレータを使ってコンストラクタからオブジェクトを一つ獲得します.
new演算のプロセス:
4、オブジェクトがある要求に応答できない場合、この要求をそのコンストラクタのプロトタイプに委託します.
ES 6プロトタイプ引継ぎ
デザインモードから言えば、プロトタイプはオブジェクトを作成するためのモードです.オブジェクトを作成する場合、まずタイプを指定して、クラスを通してこのオブジェクトを作成します.プロトタイプモードは、別の方法を選択して、対象の具体的なタイプに関心を持たず、クローンによって同じオブジェクトを作成します.
プロトタイプの実現の鍵は、言語そのものが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());