原型对象:
每创建一个函数,该函数就会自动带有一个 prototype 属性。该属性是个指针,指向了一个对象,我们称之为 原型对象。什么是指针?指针就好比学生的学号,原型对象则是那个学生。我们通过学号找到唯一的那个学生。假设突然,指针设置 null, 学号重置空了,不要慌,对象还存在,学生也没消失。只是不好找了。
原型对象上默认有一个属性 constructor,该属性也是一个指针,指向其相关联的构造函数。
为什么要使用原型对象
function Person(name, age) {
this.name = name
this.age = age
this.eat = function () {
console.log("吃饭")
}
}
var per1 = new Person("小明", 18)
var per2 = new Person("小红", 20)
console.log(per1 === per2) //false
per1.eat() //吃饭
per2.eat() //吃饭
console.log(per1.eat === per2.eat) //false
自定义构造函数每次实例化出来的对象,构造函数都会创建一次,
所以eat方法在内存中创建了两次!他们在内存中的地址不同,所以不等!
但是因为它们的逻辑和功能一样,这样就导致了代码冗余,影响性能,所以这里就需要用到原型对象!
使用原型对象来写后
function Person(name, age) {
this.name = name
this.age = age
}
Person.prototype.eat = function () { //将eat方法添加到Person的原型中
console.log("恰饭")
}
var per1 = new Person("小明", 18)
var per2 = new Person("小红", 20)
console.log(per1 === per2) //false
console.log(per1.eat === per2.eat) //true
per1.eat() //恰饭
per2.eat() //恰饭
由此可以看出原型对象,创建了一个共用的对象,来处理共享数据。
prototype是JS中常令人迷惑的一个概念,之所以令人迷惑是因为大家总是想把它与面向对象的经典框架结合起来,反而束缚了自己的思维。JS是一个纯粹的面向对象系统,使用构造函数的prototype实现了对象属性间的共享,本文探索了prototype的本质并归纳总结了prototype的使用规则。