一、原型
proto原形(属性访问器)
proto**并不是一样属性 ,它是一个访问器,使用getter、setter来调用原型上的方法。**
let hd = {}hd.__proto__ = '1'// 是不可以直接给__proto__赋值的。因为它不完全是一个属性,// 除非使用Object.create(null, {})讲原形去掉
数组的原形为3层、对象的原形为2层、都是基于window之上
创建没有原型的对象
Object.create(null, {})// 没有原形的对象、完全是字面量的对象。// null参数如果绑定的是一个对象,那么它的原型就复制了绑定的那个对象、不是继承。
proto和Prototype的区别
只有构造函数才有Prototype原形对象也就是new的对象、并且通过bind()绑定也是更改不了的。
function fun() {name: '123'}var a = new fun()var b = new fun()console.log(a.name) // 123console.log(b.name) // 123// 多个构造函数的prototype原型对象,是共享一个Prototype的
proto是服务于当前对象的
Prototype是服务于函数实例化后的对象(let a = new function())
所以:创建的对象的父级都是构造对象的prototype
let obj = {} // new Objectconsole.log(obj.__proto__ == Object.prototype) // truelet arr = [] // new Arrayconsole.log(arr.__proto__ == Array.prototype) // truelet Str = [] // new Stringconsole.log(Str.__proto__ == String.prototype) // truelet Boo = [] // new Booleanconsole.log(Boo.__proto__ == Boolean.prototype) // true
指定原形的父级及获取
let a = {}let b = {}Object.setPrototypeOf(a, b) // 将a的原形父级绑定到bObject.getPrototypeOf(a) // 获取a的原形b
原型检测
instanceof
是否在原型链上isPrototypeOf
let a = {}let b = {}console.log(b.isPrototypeOf(a)) // false
二、继承
是原型的继承、而不是修改原型
let user = {}
