原型,构造函数 ,和实例的关系
开始探究new()和create()前 先整理下 原型,构造函数 ,和实例的关系
- 实例=new 构造函数()
- 实例.prototype 指向原型
- 构造函数的.prototype 指向原型;
- 原型的本质是一个对象
- 实例.prototype===构造函数的.prototype 指向原型;
- 原型.constructor指向构造函数
- 实例.constructor也指向构造函数因为实例自己没有此属性,会去找原型的相关属性,也就指向构造函数,
- 构造函数的prototype在不指向的情况下指向Object,Object的prototype指向null
- 原型也可能有自己的原型,那么就形成了原型链,实例在查询某个属性时 会沿着原型链逐级向上查找直到找到目标属性(这就是继承)
new
new的使用
function A (){}
const a=new A()
复制代码
new的原理
- 创建一个空对象
- 空对象的__proto__属性指向构造函数的prototype属性 指向同一个原型
new的实现
const a={}
a.__proto__=A.proptotype
复制代码
单纯的原型链继承弊端
- 原型的属性是被所有实例共享的(继承的弊端),会存在实例篡改属性问题
其他的继承方式—-待更新
ceate
ceate的使用
const obj=Object.create(func)
复制代码
ceate的原理
- ceate方法里创建一个对象(构造函数)
- 对象的 prototype属性指向,ceate方法的人参
- 返回 该对象的实例
ceate的实现
function create(prpto){
function Fn(){}
Fn.prototype=proto;
return new Fn()
}
复制代码
new和 ceate的区别
- new 实例化的对象原型指向的是构造函数的原型
- create生成的对象的原型指向的是 Object.create(proto) 的入参
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END