说道原型和原型链,首先我们需要了解一下对象这个概念
首先我们用一个简单常见的方式来创建一个对象
function person(name,age){
this.name = name
this.age = age
this.say = function(){
console.log('hello my name is '+ this.name)
}
}
var objXiaoMing = new person('xiaoming',20)
var objLiLei = new person('lilei',18)
console.log(objXiaoMing.name) //xiaoming
console.log(objXiaoMing.age) //20
objXiaoMing.say() //hello my name is xiaoming
console.log(objLiLei .name) //lilei
console.log(objLiLei .age) //18
objLiLei .say() //hello my name is lilei
这种方式很常见也是经常的一种创建对象的方式,通过构造函数实例化一个对象!
people这个函数我们称之为构造函数,objXiaoMing 我们称之为这个函数的实例对象,也称之为实例
说到这里,肯定有小伙伴想知道new到底做了什么
- 创建一个新对象;
- 将构造函数的作用域赋给新对象(因此 this 就指向了这个新对象) ;
- 执行构造函数中的代码(为这个新对象添加属性) ;
- 返回新对象。
PS:记住这个什么是构造函数,什么是实例,下面的内容会大量提到
说道创建对象,我们就要说道我们的主题之一,原型
首先我们使用构造函数创建实例化对象肯定不是为了仅仅创建一个对象,这样的话对于代码的话会比较繁琐,我们肯定会创建多个对象才会用到上面的方式,但是如果我们使用一个构造函数创建多个对象的话,那么他们肯定会有相同的属性和方法,由于每次对象的创建都会开辟空间进行存储,他们相同的属性就会重复存储,这样的话对性能和内存都是一种浪费,我们可以使用原型来操作进行属性和方法的存储,具体怎么做呢?
//每个人都有一个愿望就是世界和平
function person(name,age){
this.name = name
this.age = age
this.say = function(){
console.log('hello my name is '+ this.name)
}
}
person.prototype.wish = functionm(){
console.log('世界和平')
}
var objXiaoMing = new person('xiaoming',20)
var objLiLei = new person('lilei',18)
console.log(objXiaoMing.wish === objLiLei.wish) //true
我们通过打印台打印的时候就可以发现结果是true,因为wish属于函数,属于按地址存储的对象,结果为ture就可以理解成这两个对象的方法指向的是同一个内存,由此我们可以使用构造函数的原型这个方法来创建相同的属性和方法
如果认真看到这里,应该能理解什么是原型,什么是实例化对象,什么是构造函数这三个概念
通过这三个概念我们继续引进两个概念构造器和proto
构造器 constructor:构造函数实例化对象我们可以简单的理解成构造函数创建了一个对象,那么这个被创建的对象的构造器就是创建他出来的函数
在上述代码加入
console.log(objXiaoMing.constructor === person) //true
proto:他属于实例对象的属性,指向的是构造函数的原型
console.log(objXiaoMing.__proto__=== person.prototype) //true
看完这篇文章不要蒙,我们总结一下,这篇文章的关键点只有五个概念和两个指向
- 什么是构造函数
- 什么是实例(实例对象)
- 什么是原型
- 什么是构造器
- 什么是proto
指向一
实例对象的constructor指向他的构造函数
实例对象的proto指向构造器的原型
最后送个图方便理解