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 前端小白