深入理解JavaScript之prototype原型以及原型链

什么是原型?

函数一旦创建就有一个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

对象成员的查找规则就是沿着原型链查找

当访问一个对象的属性或者方法时:

  1. 先查找自身对象中有没有,有就退出查找,否则沿着原型链查找(__proto__指向的prototype原型对象)
  2. 再查找构造函数的原型对象中有没有,有就退出查找,否则沿着原型链查找
  3. 再看Object构造函数原型中有没有,有就退出查找,否则沿着原型链查找,直至NULL结束
发布了5 篇原创文章 · 获赞 6 · 访问量 69

猜你喜欢

转载自blog.csdn.net/qq_22841567/article/details/104611122