原生js:原型和原型链
// prototype是函数的一个属性,它是一个对象,它是函数new出来的对象的公共祖先
// 如果prototype上属性和构造函数中属性重名,以构造函数中属性为主
// 实例只可以查prototype上的属性或方法,无法增删改
// 实例对象的属性__proto__指向构造函数的prototype,为什么通过Car.prototype可以访问到name?因为实例化时Car.prototype赋值给了__proto__
// prototype对象中默认有constructor属性,它是一个函数,指向构造函数本身,并且可以修改
/*
重写prototype
构造器可以修改,如果不写constructor,那么constructor默认指向Object
实例化之前,重写prototype,实际上是重写构造器中的prototype,重写的结果会影响到实例对象
实例化之后,重新prototype,重写的内容不会影响到实例对象,car.__proto__ === Car.prototype不成立
*/
// __proto__也可以修改
// 原型链:沿着__proto__往上一层一层地找属性值
// 原型链的顶端是Object.prototype,它的__proto__属性为null
// 实例对象只能更改自己,不能更改父级,但是可以更改父级的引用值
// const obj1 = Object.create(obj) 将obj当做obj1的原型创建obj1
// 不是所有的对象都继承于Object.prototype:const obj = Object.create(null),因此obj无法使用toString等方法