prototype、__proto__概括

一、new關鍵字:

敘述:在java和JavaScript中,new都是生成一個實例,而二者的機制不相同,JavaScript中,new關鍵字會引起(var newObject = new parent())如下幾個過程:前端

生成一個新對象{}--->{}.__proto__ = {}_parent.prototype(賦值)--->調用parent(),並將this綁定到{}對象上--->若是parent()沒有返回對象,則返回{}java

new關鍵字的缺陷:沒法共享屬性和方法,共享是什麼意思呢?看一個例子bash

//父類
function parent(name){
    this.name = name;
}
parent.prototype = {
    kinds: "狗"
}
//子類繼承
let child1 = new parent("tom");
//打印屬性
console.log(child1.name); //"tom"
console.log(child1.kinds);//"狗"
//修改父類
parent.name = "tony";
parent.prototype.kinds = "貓";
//再次打印屬性
console.log(child1.name);//"tom"
console.log(child1.kinds);//"貓"
複製代碼

二、對象的幾種命名形式:

  • 一、var $anyName = {};
  • 二、var $anyName = new Object();
  • 三、var $anyName = Object.create($anyName_parent);
  • 四、var $anyName = new $anyName_parent();<與2一致,2爲直接繼承Object>
  • 五、class $anyName{constructor(){}}
  • 六、funtion $anyName(){}
  • 七、...

function $anyName(){}形式;

  • $anyName.__proto__ == Funtion.prototype
  • 解釋:任何函數(這裏不稱爲對象以做形式區分)的__proto__(隱式原型)和Function.prototype(顯式原型)都相等,function Object(){}也不例外

非function $anyName(){}形式;

  • 列舉如下命名形式:一、var $anyName = new Object();二、var $anyName = new $anyName_parent();三、class $anyName{}
  • $anyName.__proto__==$anyName_parsent.prototype
  • 解釋:任何命名的對象(或實例)的__proto__(隱式原型)和其繼承的父對象(或構造函數)的prototype(顯式原型)都相等,有例外
  • except:Object.__proto__ == null

$anyName表明任何命名;函數

下圖爲參照:ui

注意:

Object.create():會直接繼承Object對象this

instanceof原理

利用原型鏈查找 流程: obj instanceof obj2:spa

//大體流程,可是instanceof源碼可能不是這樣的
function instanceof(obj,obj2){
    let findDis = obj.__proto__;
    let findResult = false;
    do{
        if(findDis===obj2.prototype){
            findResult = true;
            break;
        }
        findDis = findDis.__proto__;
    }while(findDis===null)
    return findResult;
}
複製代碼


from 前端小白prototype

相關文章
相關標籤/搜索