目录
1. 原型链为什么要出现?
2. 原型是什么
3. 原型链是什么
4. 一些代码片段
1. 原型链为什么要出现?
声明2个实例,每个实例都会独立创建sayHi方法,非常占用内存。一样的方法,可以放在原型对象上共用。
function Person(name, age) {
this.name = name
this.age = age
this.sayHi = () => {
console.log(1);
}
}
let p1 = new Person('ls', '19')
let p2 = new Person('zs', 20)
console.log(p1.sayHi === p2.sayHi); // false
p1.sayHi()
p2.sayHi()
2. 原型是什么
-
每个函数身上都有要给prototype属性指向它的伴生对象
-
每个对象身上都有一个proto属性,指向它的构造函数的伴生对象
-
伴生对象身上有constructor属性,指向它的构造函数。伴生对象也有proto属性,指向父节点的prototype
-
我们一般会在prototype属性上面挂载公用的方法
-
class语法,里面的方法,就是直接挂载到原型上面的。但是如果加了static关键字,就不是挂载到prorotype上
-
原型的特点:JS对象是通过引用来传递的,当修改原型时,与之相关的对象也会继承这个修改
-
function Object和 function Function也是构造函数Function的实例对象, 他们俩都有proto属性指向Function.prototype
3. 原型链是什么
-
原型链是什么
-
proto属性的指向,就会构成了原型链
-
当我们需要一个属性时,JS引擎会先查看当前对象中是否有这个属性,找不到,就会往proto属性关联的prototype对象查找
-
最终的根节点就是 Object.prototype.proto属性,指向的是undefiend
-
查找的链路越长,对性能的影响就会越大
4. 一些代码片段
var a = {}
a.constructor.prototype === a.__proto__ // true 因为 a.constructor就是Object构造函数