原型
打印数组
当把一个变量打印出来时 👇数组,除了有项的值,还有一个length和
__proto__ 属性,指向了该数组的原型
这个属性在现在来说已经不推荐直接去使用它了 这只是浏览器在早期为了让我们访问到内部属性
[[prototype]]来实现的一个东西)
👇 展开发现里面 constructor 属性也就是构造函数,是一个数组方法

👆 且还有一个原型__proto__ 属性
👇 展开发现constructor 属性是一个对象方法,且没有更深层的原型了

打印对象
对象原型__proto__里constructor 属性是对象方法 👇 且没有更深层的原型了(比数组少一层

👆我们也可以得出数组本质上是一种特殊的对象
创建没有原型的对象
可以利用Object.create(null,{...})创建一个没有原型的对象
👆没有__proto__,原因是第一参数指定原型-MDN,指定null则没有
查看原型链方法
js
obj1.hasOwnProperty( "name" )查看name属性是否在obj1原型链上
改变原型链方法
js
// 1. 赋值修改 prototype
obj1.prototype = obj2.prototype
// 2. 调用Object.setPrototype函数
Object.setPrototype( obj1 , obj2 )obj2 替换掉obj1的原型中
构造函数
由函数 func.call() 可以 .xx 的调用形式可得出,函数也是 对象/引用类型
new 构造函数 ,可以创建对象
JS有内置的构造函数, Array Object String
js
let arr = []
// 相当于
let arr = new Array其他同理如
{} --> new Object'' --> new String
👆 对象构造函数 Object 内有 prototype -原型对象(一般是Object)
并且这个属性的值和先前我们在 __proto__ 中看到的一模一样
总结

为什么 obj 可以访问到 valueOf 函数,就是因为 obj 通过原型链找到了 valueOf 函数
Object是所有对象的爸爸,所有对象类型都可以通过__proto__找到它Function是所有函数的爸爸,所有函数都可以通过__proto__找到它- 函数的
prototype是一个对象 - 对象的
__proto__属性指向原型,__proto__将对象和原型连接起来组成了原型链