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

相关文章
相关标签/搜索