プロトタイプチェーン
- (文)作成すると、いくつかの方法がありますオブジェクト
- プロトタイプコンストラクタの例では、プロトタイプチェーン
instanceof
原則- new演算子
A.オブジェクトを作成するには、いくつかの方法があります。
1.リテラル
var test2 = {x:123,y:345};
console.log(test2);//{x:123,y:345};
console.log(test2.x);//123
console.log(test2.__proto__.x);//undefined
console.log(test2.__proto__.x === test2.x);//false
2.コンストラクタnew
// 方法1 #通过new Object声明的一个对象
var test1 = new Object({x:123,y:345});
console.log(test1);//{x:123,y:345}
console.log(test1.x);//123
console.log(test1.__proto__.x);//undefined
console.log(test1.__proto__.x === test1.x);//false
// 方法2 #使用显式构造函数创建对象
var M = function(name){ this.name = name;};
var o3 = new M('o3'); //M {name: "o3"}
新しい役割1.新しいオブジェクトを作成し、ポイントのコンストラクタを2.この; 3.コンストラクタが戻ってきた、それは新しいオブジェクトを、置き換えられます、新しいオブジェクトかどうか
3.内蔵の方法
Obejct.create(obj,descriptor)
、これは、オブジェクトobjである、(オプション)記述子属性は、指定されたプロトタイプを持つオブジェクトを作成して記述し、選択的に指定された属性が含まれています。
let p = {x:123,y:345};
let test = Object.create(p);
console.log(test);//{}
console.log(test.x);//123
console.log(test.__proto__.x);//3
console.log(test.__proto__.x === test.x);//true
console.log(test.__proto__ === p) // true
Object.create
このパラメータには、新しいオブジェクトのプロトタイプオブジェクトが割り当てられているようなオブジェクトであるtest
、されたtest
プロトタイプオブジェクトのプロトタイプチェーンで接続され、自身がこの特性を持っていません。(だから、test
オブジェクト自体は、属性名属性が唯一のプロトタイプチェーンを通ってくることができます名前を付けていません。
3つの方法の長所と短所
- 関数:宣言の目的、及び割り当てる機能と値を達成することができます
- 継承:オブジェクトが内蔵されたプロパティの後継を作成する方法__proto__
- 隠し属性は:三つの方法がいくつか隠された属性を生成する内部(プロパティやメソッド)の各メンバーのデフォルトを宣言します、これらの属性を読み取ることができ、非表示設定可能な、プロパティの分類は、以下を参照してください。
- 読むためにプロパティ:
Object.getOwnPropertyDescriptor()或getOwnPropertyDescriptors()
- プロパティ設定:
Object.definePropertype或Object.defineProperties
プロトタイプチェーンのII。の関係
図は慎重に試作品、コンストラクタ、オブジェクトインスタンス、プロトタイプチェーンとの間の関係を観察します。
1.オブジェクト・インスタンス
長いオブジェクトとしてインスタンスであるように、オブジェクトを作成する上記のいくつかの方法を検討、オブジェクトのインスタンスは、暗黙のプロトタイプ持つ__proto__
オブジェクト。
2.コンストラクタ
任意のキーワードnew
操作の背後にある関数には、この関数はコンストラクタであり、この後者の機能の新しい使用する限り、これらの機能のいずれかが、コンストラクタと呼ばれることができることを言って正確。
コンストラクタができnew
、オペレータは、インスタンスを生成します。
3.プロトタイプオブジェクト
任意の機能を持っているprototype
財産を、彼は、これは、ユニークな機能であるprototype
、明示的なプロトタイプオブジェクトを参照します。
オブジェクトのインスタンスを持つ__proto__
オブジェクト。彼は、これは、ユニークなオブジェクトである__proto__
暗黙のプロトタイプオブジェクトを参照します。
__proto__
プロトタイプチェーンは、実際に、それは常にポイントクエリで使用されていますprototype
。
prototype
あなたはコンストラクタを定義するときに自動的に作成される一意の関数である、それは常にある__proto__
に言及しました。
4.プロトタイプチェーン
各オブジェクトは、プロトタイプを持つことができ_proto_
、このプロトタイプはまた、プロトタイプチェーンを形成し、その上で独自のプロトタイプを持っている、とすることができます。特定のプロパティを検索し、私たちは、このオブジェクトを見つけるに行き、そうでない場合、そのプロトタイプオブジェクトに中に入った、またはされていない場合、そのプロトタイプオブジェクトのプロトタイプオブジェクト行くを知っているエンドを探して行くnull
......この操作は全体のプロトタイプチェーンに委託された、これは我々がプロトタイプチェーン呼んでいます
その過程を調べることにより、どのようなプロトタイプチェーンこれを達成することですか?
プロトタイプとプロトタイプの__proto__プロパティを介してこれを実現するためのプロトタイプチェーンを探します。
let obj1 = {name:'lucas'};
obj1.__proto__ === Object.prototype // true
obj1.__proto__.__proto__ // null #这是原型链顶端了
Object.prototype.__proto__ // null #这是原型链顶端了
function Person(){}
Person.prototype.__proto__.__proto__ // null #这是原型链顶端了
let person = new Person();
person.__proto__.__proto__.__proto__ // null #这是原型链顶端了
person.__proto__ === Person.prototype // true
function M (name) {
this.name = name;
}//person是构造函数
var o3 = new M('o3') // personTwo是实例
プロトタイプオブジェクト属性は、デフォルトコンストラクタポイントコンストラクタを持っています
三。INSTANCEOF原則
instanceof
主に特定の型のインスタンスは、インスタンスのタイプ先祖または親タイプのインスタンスであるかどうかを決定するために使用することができるかどうかを決定する使用。
instanceof
主な原則はプロトタイプ変数の右側にはプロトタイプチェーンの変数に残すことができ限り、達成することです。そのため、instanceof
あなたは右のプロトタイプ変数を見つけるまで、検索プロセスでそれが失敗した場合、それはfalseを返し、左側のプロトタイプチェーンの変数を横断します。
实例对象上有__proto__这个属性,实例对象的这个属性引用是它构造函数的原型对象(也就是找到的这个构造函数);
构造函数有prototype这个属性,这个属性引用的原型对象,在往下走,实例对象的__proto__这个属性,其实是引用这个原型对象。
アナログinstanceofの開発
function instanceof(left, right) {
const rightVal = right.prototype
const leftVal = left.__proto__
// 若找不到就到一直循环到父类型或祖类型
while(true) {
if (leftVal === null) {
return false
}
if (leftVal === rightVal) {
return true
}
leftVal = leftVal.__proto__ // 获取祖类型的__proto__
}
}
四。New演算子
var new2 = function(func){
//1.创建一个空对象,这个对象要继承这个构造函数的原型对象(空对象要关联构造函数的原型对象;)
let o = Object.create(func.prototype);
//2.执行构造函数
let k = func.call(o);//call用来转移上下文(this),把这个上下文转成o对象
//3.判断构造函数的运行结果是不是对象类型
if(typeof k ==='object'){
return k;
}else{
return o;
}
};