JavaScript使用prototype属性实现继承操作示例


Posted in Javascript onMay 22, 2020

本文实例讲述了JavaScript使用prototype属性实现继承操作。分享给大家供大家参考,具体如下:

JS并没有显式的继承语法,在JS中所有的对象都是Object的子类实现, 因而对象之间是平等关系.

尽管如此我们可以通过特殊的方法达到继承的效果.

当然JS也不能直接定义类, 我们通过定义函数可以得到一个同名的类 , 同时这个函数就是这个类的构造器,

在定义函数时以this修饰的变量就是定义的 类的实例中的属性,当这个属性时函数时,  就可以认为这个属性变成了一个实例方法

//定义一个Person类
function Person(name , age)
{
  this.name=name;
  this.age=age;
  //定义一个info函数
  this.info=function()
  {
    document.writeln("年龄"+this.age+"姓名"+this.name);
  }
}
//创建Person类的实例对象
var p1= new Person('xiaoming',20);
//调用p1的info方法
p1.info();
var p2= new Person('wang',22);
p2.info();

这种在类内(函数内)定义函数的方式是有弊端的:

  • 性能低下, 这种方式定义函数在每次创建对象时都会创建一个新的info函数, 有多个对象就会有多个info函数,实际上我们只需要一个info函数,  这样就会造成系统内存泄漏, 引起性能的下降
  • 使info函数中的局部变量产生闭包, 闭包会扩大局部变量的作用域,使局部变量存活到函数外

为了避免这两种情况, 通常不建议在类定义时为类定义方法,而是采用prototype属性:

JS中所有类(函数)都有一个prototype属性, 为该属性增加属性方法可以视为对类的拓展,

也就是增加了prototype属性的类继承了原有的类 , 这也就是JS所提供的伪继承机制

//定义一个Person类
function Person(name , age)
{
  this.name=name;
  this.age=age;
  //定义一个info函数
  this.info=function()
  {
    document.writeln("年龄"+this.age+"姓名"+this.name);
  }
}
//创建Person类的实例对象
var p1= new Person('xiaoming',20);
//调用p1的info方法
p1.info();
 
//为Person类增加walk方法
Person.prototype.walk=function()
{
  document.writeln(this.name+'正在走<br/>');
}
var p2=new Person('xiaohong',20);
//p2可以调用Person中的方法
p2.info();
//也可以调用prototype属性增加的方法
p2.walk();
//JS允许为类动态增加方法和属性,这里p1也可以调用walk
p1.walk();

上例为prototype属性增加了方法可以认为是为Person类动态地增加了方法,

这种方式增加的方法会让所有实例共享一个walk方法, 可以注意到是Person.prototype类的属性,并非实例

walk方法不在Person函数内,因此不会产生闭包,

这种为类动态地增加属性和方法可以被当作一种伪继承,

但这种伪继承并非产生 了新的子类而是修改了原有的类

别着急,prototype属性还有另一种方式实现继承:

prototype属性代表该类原型对象, 即默认是一个Object对象, 将类prototype设为父类实例可以实现继承

function Person(name,age)
{
  this.name=name;
  this.age=age;
}
Person.prototype.say=function()
{
  console.log(this.name+'说话了');
}
var per = new Person('小明',20);
per.say();
//再定义一个student类,欲意继承Person
function Student (grade)
{
  this.grade=grade;
}
//将student的prototype设为Person对象
Student.prototype =new Person('小红',22);
//为Student添加方法
Student.prototype.intro= function()
{
  console.log(this.name+'是'+this.grade+'年级学生');
}
var stu=new Student(3);
stu.name="小刚";
console.log(stu instanceof Person&& stu instanceof Student);//true
stu.say();//小刚说话了
stu.intro();//小刚是3年级学生

上例定义了Person类,增加了say()方法

又定义了Student类, 并将Student类的prototype属性设为Person对象, 表明Student原型是Person对象,

也就是Student继承了Person, 会得到其方法和属性

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
jQuery Ajax请求状态管理器打包
May 03 Javascript
js函数的引用, 关于内存的开销
Sep 17 Javascript
鼠标移到图片上变大显示而不是放大镜效果
Jun 15 Javascript
原生JavaScript实现合并多个数组示例
Sep 21 Javascript
javascript 实现map集合
Apr 03 Javascript
wangEditor编辑器失去焦点后仍然可以在原位置插入图片分析
May 06 Javascript
详解JavaScript中循环控制语句的用法
Jun 03 Javascript
微信小程序购物商城系统开发系列-工具篇的介绍
Nov 21 Javascript
利用jquery获取select下拉框的值
Nov 23 Javascript
JavaScript中将值转换为字符串的五种方法总结
Jun 06 Javascript
layer设置maxWidth及maxHeight解决方案
Jul 26 Javascript
react-intl实现React国际化多语言的方法
Sep 27 Javascript
详解如何修改 node_modules 里的文件
May 22 #Javascript
Node.js API详解之 readline模块用法详解
May 22 #Javascript
vue+canvas实现移动端手写签名
May 21 #Javascript
基于canvas实现手写签名(vue)
May 21 #Javascript
jQuery实现移动端笔触canvas电子签名
May 21 #jQuery
js cavans实现静态滚动弹幕
May 21 #Javascript
Object.keys() 和 Object.getOwnPropertyNames() 的区别详解
May 21 #Javascript
You might like
浅析linux下apache服务器的配置和管理
2013/08/10 PHP
PHP命令Command模式用法实例分析
2018/08/08 PHP
微信公众平台开发教程⑥ 微信开发集成类的使用图文详解
2019/04/10 PHP
laravel 使用事件系统统计浏览量的实现
2019/10/16 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
2019/12/25 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
2020/02/27 PHP
Aster vs Newbee BO5 第一场2.19
2021/03/10 DOTA
Javascript 圆角div的实现代码
2009/10/15 Javascript
jQuery基础知识filter()和find()实例说明
2010/07/06 Javascript
详解addEventListener的三个参数之useCapture
2015/03/16 Javascript
Vue.js系列之项目搭建(1)
2017/01/03 Javascript
jQuery点击头像上传并预览图片
2017/02/23 Javascript
Vue中div contenteditable 的光标定位方法
2018/08/25 Javascript
如何封装了一个vue移动端下拉加载下一页数据的组件
2019/01/06 Javascript
Node.js fs模块(文件模块)创建、删除目录(文件)读取写入文件流的方法
2019/09/03 Javascript
[02:12]DOTA2英雄基础教程 变体精灵
2013/12/16 DOTA
Python标准库内置函数complex介绍
2014/11/25 Python
在Python的Django框架中使用通用视图的方法
2015/07/21 Python
Python中字符串的常见操作技巧总结
2016/07/28 Python
Python实现两个list求交集,并集,差集的方法示例
2018/08/02 Python
Python 加密与解密小结
2018/12/06 Python
Python爬虫学习之获取指定网页源码
2019/07/30 Python
python多线程使用方法实例详解
2019/12/30 Python
使用Python发现隐藏的wifi
2020/03/04 Python
Python实现转换图片背景颜色代码
2020/04/30 Python
如何把python项目部署到linux服务器
2020/08/26 Python
golang/python实现归并排序实例代码
2020/08/30 Python
python可视化分析的实现(matplotlib、seaborn、ggplot2)
2021/02/03 Python
全球异乡人的跨境社交电商平台:Kouhigh口嗨网
2020/07/24 全球购物
UNIX文件系统分类
2014/11/11 面试题
最新奶茶店创业计划书范文
2014/02/08 职场文书
工程造价专业求职信
2014/07/17 职场文书
四风问题对照检查材料整改措施
2014/09/27 职场文书
2015年母亲节活动策划方案
2015/05/04 职场文书
解决Swagger2返回map复杂结构不能解析的问题
2021/07/02 Java/Android
Java中Quartz高可用定时任务快速入门
2022/04/03 Java/Android