prototype、__proto__归纳

1、new关键字:

叙述:在java和JavaScript中,new都是生成一个实例,而两者的机制不相同,JavaScript中,new关键字会引发(var newObject = new parent())以下几个过程:

生成一个新对象{}--->{}.__proto__ = {}_parent.prototype(赋值)--->调用parent(),并将this绑定到{}对象上--->如果parent()没有返回对象,则返回{}

new关键字的缺陷:无法共享属性和方法,共享是什么意思呢?看一个例子

//父类
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);//"猫"
复制代码
2、对象的几种命名形式:
  • 1、var $anyName = {};
  • 2、var $anyName = new Object();
  • 3、var $anyName = Object.create($anyName_parent);
  • 4、var $anyName = new $anyName_parent();<与2一致,2为直接继承Object>
  • 5、class $anyName{constructor(){}}
  • 6、funtion $anyName(){}
  • 7、...
function $anyName(){}形式;
  • $anyName.__proto__ == Funtion.prototype
  • 解释:任何函数(这里不称为对象以作形式区分)的__proto__(隐式原型)和Function.prototype(显式原型)都相等,function Object(){}也不例外
非function $anyName(){}形式;
  • 列举以下命名形式:1、var $anyName = new Object();2、var $anyName = new $anyName_parent();3、class $anyName{}
  • $anyName.__proto__==$anyName_parsent.prototype
  • 解释:任何命名的对象(或实例)的__proto__(隐式原型)和其继承的父对象(或构造函数)的prototype(显式原型)都相等,有例外
  • except:Object.__proto__ == null

$anyName代表任何命名;

下图为参照:

注意:

Object.create():会直接继承Object对象

instanceof原理

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

//大致流程,但是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 前端小白

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值