詳細なプロトタイププロトタイプチェーン

プロトタイプチェーン

  • (文)作成すると、いくつかの方法がありますオブジェクト
  • プロトタイプコンストラクタの例では、プロトタイプチェーン
  • 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つの方法の長所と短所

  1. 関数:宣言の目的、及び割り当てる機能と値を達成することができます
  2. 継承:オブジェクトが内蔵されたプロパティの後継を作成する方法__proto__
  3. 隠し属性は:三つの方法がいくつか隠された属性を生成する内部(プロパティやメソッド)の各メンバーのデフォルトを宣言します、これらの属性を読み取ることができ、非表示設定可能な、プロパティの分類は、以下を参照してください。
  4. 読むためにプロパティ:Object.getOwnPropertyDescriptor()或getOwnPropertyDescriptors()
  5. プロパティ設定:Object.definePropertype或Object.defineProperties

プロトタイプチェーンのII。の関係

図は慎重に試作品、コンストラクタ、オブジェクトインスタンス、プロトタイプチェーンとの間の関係を観察します。

関係のプロトタイプチェーン

1.オブジェクト・インスタンス

長いオブジェクトとしてインスタンスであるように、オブジェクトを作成する上記のいくつかの方法を検討、オブジェクトのインスタンスは、暗黙のプロトタイプ持つ__proto__オブジェクト。

2.コンストラクタ

任意のキーワードnew操作の背後にある関数には、この関数はコンストラクタであり、この後者の機能の新しい使用する限り、これらの機能のいずれかが、コンストラクタと呼ばれることができることを言って正確。

コンストラクタができnew、オペレータは、インスタンスを生成します。

3.プロトタイプオブジェクト

任意の機能を持っているprototype財産を、彼は、これは、ユニークな機能であるprototype、明示的なプロトタイプオブジェクトを参照します。

オブジェクトのインスタンスを持つ__proto__オブジェクト。彼は、これは、ユニークなオブジェクトである__proto__暗黙のプロトタイプオブジェクトを参照します。

__proto__プロトタイプチェーンは、実際に、それは常にポイントクエリで使用されていますprototype

prototypeあなたはコンストラクタを定義するときに自動的に作成される一意の関数である、それは常にある__proto__に言及しました。

4.プロトタイプチェーン

各オブジェクトは、プロトタイプを持つことができ_proto_、このプロトタイプはまた、プロトタイプチェーンを形成し、その上で独自のプロトタイプを持っている、とすることができます。特定のプロパティを検索し、私たちは、このオブジェクトを見つけるに行き、そうでない場合、そのプロトタイプオブジェクトに中に入った、またはされていない場合、そのプロトタイプオブジェクトのプロトタイプオブジェクト行くを知っているエンドを探して行くnull......この操作は全体のプロトタイプチェーンに委託された、これは我々がプロトタイプチェーン呼んでいます

その過程を調べることにより、どのようなプロトタイプチェーンこれを達成することですか?
プロトタイプとプロトタイプの__proto__プロパティを介してこれを実現するためのプロトタイプチェーンを探します。

IMG

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は回路図

アナログ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演算子

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;
    }
 };

おすすめ

転載: www.cnblogs.com/jing-tian/p/12244374.html