构造函数和原型对象这个糟心的东西
为什么会看这个东西,因为我看到其他人在使用,而自己不懂的东西就会有一种学习的冲动。哈哈哈!!!
概念解析
构造函数:
就是描述某个事物特征、动作的一个模板,为了区别于普通函数,首字母大写。有了这个函数,就可以通过new命令创建实例对象,所谓实例对象,就是有了具体特征、动作的一个事物。
function Animal(name,eat){ //作为一个模板存在,该模板中有描述姓名、吃的属性,以及爱好的动作
this.name = name,
this.eat=eat,
this.habby = function(){
console.log(this.name+"喜欢"+this.eat)
}
}
const T = new Animal("TOM","吃鱼"); //创建了一个属于TOM的实例对象
T.habby() //TOM喜欢吃鱼
原型对象:
函数创建了之后就会生成一个prototype
属性,该属性作为一个指针指向原型对象
;
那么原型对象中又有一个constructor
属性,该属性同样作为一个指针,指向的是prototype
属性对应的构造函数;
构造函数使用new命令实例化之后得到实例化对象Animal
,该实例化对象又可以通过__proto__
属性指向原型对象
如上就是构造函数和原型对象以及实例化之后的对象之间的关系;
function fo(){}
console.log(fo.prototype) //原型对象如下图,其中有一个constructor属性,可以找到对应的函数
下面给个小例子来说明下怎么使用,好处在哪里(例:创建一个公共的模板来描述动物的姓名和喜好)
- 正常创建构造函数
function Animal(name,eat){ //作为一个模板存在,该模板中有描述姓名、吃的属性,以及爱好的动作
this.name = name,
this.eat=eat,
this.habby = function(){
console.log(this.name+"喜欢"+this.eat)
}
}
const T = new Animal("TOM","吃鱼"); //创建了一个属于TOM的实例对象
const J = new Animal("JICK","吃蛋糕");
T.habby() //TOM喜欢吃鱼
T.habby===J.habby //false
这种方式有两个问题,
1:实例化对象的时候,参数的顺序不能乱,一旦乱了,那么执行的结果也就不一样了;
2:实例对象公用的方法habby会被多次生成,占用内存,资源浪费;
解决问题1:实例化对象,传递参数的时候以对象的方式传入;
2:使用原型属性的方式绑定公共的方法
function Animal(params){
this.name = params.name,
this.eat = params.eat
}
Animal.prototype.habby = function(){ //把公共的方法绑定在原型对象上
console.log(this.name+"喜欢"+this.eat)
}
var T = new Animal({name:"TOM",eat:"吃鱼"})
var J = new Animal({name:"JICK",eat:"吃蛋糕"})
T.habby() //TOM喜欢吃鱼
console.log(T.habby===J.habby) //true