一. 实例、构造函数、原型、和原型链之间的关系
function Person() {} // 构造函数和普通函数的创建方式一样,唯一的区别是构造函数的首写字母需要大写 console.dir(Person.prototype) // 原型(prototype)是一个对象,他和构造函数的关系就是'构造函数中有一个prototype属性,通过这个属性就能访问到原型' let obj = new Person() // 实例(instance即通过new关键字创建出来的obj)通过'继承'也拥有了原型上的属性,'继承'这个行为是通过new操作符内部来进行实现的 Person.prototype.name = 'name' console.log(obj.__proto__.name) // 实例(obj)通过__proto__可以直接访问到原型(prototype),也就可以拿到原型(prototype)上的属性和方法 console.log(Person.prototype.constructor) // 同理,既然构造函数可以通过prototype访问到原型,那么原型也就可以通过constructor来访问到构造函数 console.log(obj.name) // 如果实例(obj)想要访问属性(如name属性),但是这个属性自己并没有,他就会通过__proto__去逐级网上寻找,直到找到或者找不到(null)
备注(js中所有的对象和方法都有自己的原型,但是唯独(Object.create(null)是没有的,没有继承任何原型方法,也就是说它的原型链没有上一层))