一、原型
    proto原形(属性访问器)
    proto**并不是一样属性 ,它是一个访问器,使用getter、setter来调用原型上的方法。**

    1. let hd = {}
    2. hd.__proto__ = '1'
    3. // 是不可以直接给__proto__赋值的。因为它不完全是一个属性,
    4. // 除非使用Object.create(null, {})讲原形去掉

    数组的原形为3层、对象的原形为2层、都是基于window之上
    创建没有原型的对象

    1. Object.create(null, {})
    2. // 没有原形的对象、完全是字面量的对象。
    3. // null参数如果绑定的是一个对象,那么它的原型就复制了绑定的那个对象、不是继承。

    proto和Prototype的区别
    只有构造函数才有Prototype原形对象也就是new的对象、并且通过bind()绑定也是更改不了的。

    1. function fun() {
    2. name: '123'
    3. }
    4. var a = new fun()
    5. var b = new fun()
    6. console.log(a.name) // 123
    7. console.log(b.name) // 123
    8. // 多个构造函数的prototype原型对象,是共享一个Prototype的

    proto是服务于当前对象的
    Prototype是服务于函数实例化后的对象(let a = new function())
    image.png
    所以:创建的对象的父级都是构造对象的prototype

    1. let obj = {} // new Object
    2. console.log(obj.__proto__ == Object.prototype) // true
    3. let arr = [] // new Array
    4. console.log(arr.__proto__ == Array.prototype) // true
    5. let Str = [] // new String
    6. console.log(Str.__proto__ == String.prototype) // true
    7. let Boo = [] // new Boolean
    8. console.log(Boo.__proto__ == Boolean.prototype) // true

    指定原形的父级及获取

    1. let a = {}
    2. let b = {}
    3. Object.setPrototypeOf(a, b) // 将a的原形父级绑定到b
    4. Object.getPrototypeOf(a) // 获取a的原形b

    原型检测
    instanceof

    是否在原型链上isPrototypeOf

    1. let a = {}
    2. let b = {}
    3. console.log(b.isPrototypeOf(a)) // false

    二、继承
    是原型的继承、而不是修改原型

    1. let user = {}