JS构造函数和原型对象

构造函数和原型对象这个糟心的东西

为什么会看这个东西,因为我看到其他人在使用,而自己不懂的东西就会有一种学习的冲动。哈哈哈!!!

概念解析

构造函数:
就是描述某个事物特征、动作的一个模板,为了区别于普通函数,首字母大写。有了这个函数,就可以通过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     

猜你喜欢

转载自blog.csdn.net/baidu_41604826/article/details/89641953
今日推荐