什么是原型?
函数一旦创建就有一个prototype属性,该属性指向一个对象,该对象就是prototype对象,即原型对象。
总结:原型就是一个对象,即prototype对象。
原型的作用是:共享方法
构造函数在实例化对象的时候,每创建一个实例对象就会开辟空间存放构造函数中的属性和方法,如下:
var Person = function(name,age){
this.name = name;
this.age = age;
this.eat = function(){
console.log("吃饭")
}
}
var p1 = new Person()
var p2 = new Person()
p1和p2都有eat() 方法,该方法被创建了两次,逻辑和功能相同,仅地址不同,这样就造成代码冗余,占用内存,影响性能
为解决上述问题,可将公共方法写在原型对象中,函数的所有实例化对象可直接访问原型对象中的方法
var Person = function(name,age){
this.name = name;
this.age = age;
}
Person.prototype.eat = function(){
console.log("吃饭")
}
console.log(Person)
构造函数,原型对象,实例对象三者之间的关系
var Person = function(name,age){
this.name = name;
this.age = age;
}
Person.prototype.eat = function(){
console.log("吃饭")
}
var ws = new Person("小花",5)
以上述Person构造函数为例:
这里解释一下__proto__和constructor函数:
就像每一个函数都有prototype原型对象一样,每一个对象都会有一个__proto__,称之为对象原型。它指向构造函数的原型对象。
不管是prototype还是__proto__都有一个constructor函数指回构造函数
从上图可知:
console.log(Person.prototype.constructor === Person) //true
console.log(ws.__proto__ === Person.prototype) //true
console.log(ws.__proto__.constructor === Person) //true
原型链
从上图可知:
console.log(Person.prototype.__proto__ === Object.prototype) //true
console.log(Object.prototype.constructor === Object) //true
console.log(Object.prototype.__proto__) //null
对象成员的查找规则就是沿着原型链查找
当访问一个对象的属性或者方法时:
- 先查找自身对象中有没有,有就退出查找,否则沿着原型链查找(__proto__指向的prototype原型对象)
- 再查找构造函数的原型对象中有没有,有就退出查找,否则沿着原型链查找
- 再看Object构造函数原型中有没有,有就退出查找,否则沿着原型链查找,直至NULL结束