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