为什么需要原型及原型链?
看一个例子:
function Person(name, age) {
this.name = name;
this.age = age;
this.eat = function() {
console.log(age + "岁的" + name + "在吃饭。");
}
}
let p1 = new Person("menmen", 24);
let p2 = new Person("menmen", 24);
console.log(p1.eat === p2.eat); // false
对于同一个函数,我们通过 new
生成出来的实例,都会开出新的一块堆区,所以上面代码中 person 1
和 person 2
的吃饭是不同的。
例如,内存空间,总共就那么点内存,在不停的往里面存内容,最后内存不足。
所以,要想个法,建个类似于共享库的对象,这样就可以在需要的时候,调用一个类似共享库的对象,让实例能够沿着某个线索去找到自己归处。
而这个线索,在前端中就是原型链 prototype
。
function Person(name) {
this.name = name;
}
// 通过构造函数的 Person 的 prototype 属性找到 Person 的原型对象
Person.prototype.eat = function() {
console.log("吃饭");
}
let p1 = new Person("menmen", 24);
let p2 = new Person("梁峻荣", 24);
console.log(p1.eat === p2.eat); // true
通过分享的形式,让这两个实例对象指向相同的位置了.
每个对象都有原型,原型也是对象,原型也有原型,就形成了一个原型链
原型链作用: 对象访问成员的访问规则:如果对象访问某个成员,先看自己有没有,自己有就访问自己的,自己没有就访问原型的,如果原型也没有,就沿着原型链一直往上查找,直到找到为止,如果找到头还没有找到,就返回undefined
或报错
原型对象
原型对象是为了解决构造函数的内存浪费
原型对象的优点 :
- 解决构造函数的内存浪费
- 解决变量名污染
function Person(name,age){
this.name=name
this.age=age
}
Person.prototype.say=function(){
console.log(`我是${this.name},年龄${this.age}`)
}
let p1=new Person('jack',15)
p1.say()