Skip to content

原型

打印数组

当把一个变量打印出来时 👇数组,除了有项的值,还有一个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__ 将对象和原型连接起来组成了原型链