原型链
在讲原型链之前,我们首先要先来明确几个概念:类、对象、构造函数、原型。
类:具有相同特征(属性)和行为(方法)的事物的集合;js中对象的目的实际上就是将具有相同属性和行为的代码整合到一起,方便我们的管理。而构造函数实际上就是创建了一个类。那么如何创建一个构造函数呢,下面我举个例子给大家说明一下。
1 2 3 4 5 6 7 8 9 10 | function Person(_name,_age,_height){ this .name = _name; this .age = _age; this .height = _height; this .walk = function(){ console.log( "I can walk" ); } } var student = new Person( "洋洋" ,18,160); console.log(student.height); |
注意:构造函数的首字母一定要大写。构造函数的机制是会自动创建一个空对象,与this相关联,并将这个对象作为默认返回值返回。在上面的代码中Person就是一个构造函数,而student就是一个对象。
1 | var student = new Person( "洋洋" ,18,160);student.walk(); var student1 = new Person( "欢欢" ,19,168);student.walk(); |
现在我们来看一下student和student1表面上好像没什么问题,先创建对象再调用方法。但是实际上这样做,有一个很大的弊端。那就是对于每一个实例对象,walk()
方法都是一模一样的内容,每一次生成一个实例,都必须为重复的内容,多占用一些内存。这样既不环保,也缺乏效率。这时候就该我们的原型出场啦,
1 2 3 4 5 | Person.prototype = { walk:function(){ console.log( "I can work" ); } } |
如果将walk方法写到prototype中就解决了之前的问题,不会每次声明对象,调用walk 方法的时候都会占用内存。
想必大家对原型这个概念已经有了了解,那么接下来就要引出我们今天讲的重点原型链。什么是原型链呢?所谓原型链指的是当对象尝试获取某个属性或者某个方法时,若该对象的构造函数没有,会到该构造函数的原型中去找,如果原型也没有,会去原型对象的原型去找最终到达Object.prototype。可能现在这句话大家还不能理解,那就举个例子来说明一下,一言不合就举例。
function Student(_name,_age,_height){ this.name = _name; this.age = _age; this.height = _height; this.dance = function(){ console.log("I can dance"); } } Student.prototype = { dance:function(){ console.log("I can dance,too"); } } var student = new Student("洋洋",18,160); student.dance();
因为构造函数中有dance()方法,所以打印的结果是:I can dance;
1 2 3 4 5 6 7 8 9 10 11 12 13 | function Student(_name,_age,_height){ this .name = _name; this .age = _age; this .height = _height; } Student.prototype = { dance:function(){ console.log( "I can dance,too" ); } } var student = new Student( "洋洋" ,18,160); student.dance(); |
因为构造函数中没有dance()方法,而Student的原型中有 walk()方法,所以打印结果是I can dance,too
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | function Person(_name1,_age1,_height1){ this .name1 = _name1; this .age1 = _age1; this .height1 = _height1; } Person.prototype.dance = function(){ console.log( "I can dance" ) } function Student(_name,_age,_height){ this .name = _name; this .age = _age; this .height = _height; } Student.prototype = new Person( "123" ,12,135) ; var student = new Student( "洋洋" ,18,160); student.dance(); |
Student中没有dance()方法,Student中的原型中也没有dance()方法,所以只能去找Person的原型,打印结果为I can dance。
通过这次的讲解你懂原型链了吗?
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步