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 相关文章推荐
整理的比较全的event对像在ie与firefox浏览器中的区别
Nov 25 Javascript
jquery将一个表单序列化为一个对象的方法
Jan 03 Javascript
node.js中的console.trace方法使用说明
Dec 09 Javascript
jquery简单实现外部链接用新窗口打开的方法
May 30 Javascript
js实现Select头像选择实时预览代码
Aug 17 Javascript
JavaScript脚本库编写的方法
Dec 09 Javascript
修复jQuery tablesorter无法正确排序的bug(加千分位数字后)
Mar 30 Javascript
JS实现对中文字符串进行utf-8的Base64编码的方法(使其与Java编码相同)
Jun 21 Javascript
EasyUI的doCellTip实现鼠标放到单元格上提示单元格内容
Aug 24 Javascript
实例分析JS与Node.js中的事件循环
Dec 12 Javascript
js实现京东秒杀倒计时功能
Jan 21 Javascript
layui use 定义js外部引用函数的方法
Sep 26 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
ThinkPHP后台首页index使用frameset时的注意事项分析
2014/08/22 PHP
Linux系统下使用XHProf和XHGui分析PHP运行性能
2015/12/08 PHP
详解PHP的Yii框架中自带的前端资源包的使用
2016/03/31 PHP
tp5.1框架数据库子查询操作实例分析
2020/05/26 PHP
extjs 列表框(multiselect)的动态添加列表项的方法
2009/07/31 Javascript
js trim函数 去空格函数与正则集锦
2009/11/20 Javascript
理清apply(),call()的区别和关系
2011/08/14 Javascript
node.js学习总结之调式代码的方法
2014/06/25 Javascript
初识Node.js
2014/09/03 Javascript
使用jQuery管理选择结果
2015/01/20 Javascript
JS控制网页动态生成任意行列数表格的方法
2015/03/09 Javascript
JavaScript实现为指定对象添加多个事件处理程序的方法
2015/04/17 Javascript
ECMAScript6新增值比较函数Object.is
2015/06/12 Javascript
纯javascript移动优先的幻灯片效果
2015/11/02 Javascript
使用EVAL处理jqchart jquery 折线图返回数据无效的解决办法
2015/11/26 Javascript
JavaScript 随机验证码的生成实例代码
2016/09/22 Javascript
jQuery使用ajax方法解析返回的json数据功能示例
2017/01/10 Javascript
jQuery获取复选框选中的当前行的某个字段的值
2017/09/15 jQuery
Javascript实现运算符重载详解
2018/04/07 Javascript
Python内置函数bin() oct()等实现进制转换
2012/12/30 Python
python传递参数方式小结
2015/04/17 Python
python使用线程封装的一个简单定时器类实例
2015/05/16 Python
Python找出文件中使用率最高的汉字实例详解
2015/06/03 Python
Python导入模块时遇到的错误分析
2017/08/30 Python
Python实战小程序利用matplotlib模块画图代码分享
2017/12/09 Python
Windows下Anaconda的安装和简单使用方法
2018/01/04 Python
使用python telnetlib批量备份交换机配置的方法
2019/07/25 Python
Python pandas RFM模型应用实例详解
2019/11/20 Python
Django Form常用功能及代码示例
2020/10/13 Python
Python 的 f-string 可以连接字符串与数字的原因解析
2021/02/20 Python
编辑个人求职信范文
2013/09/21 职场文书
股份转让协议书
2014/04/12 职场文书
拆迁委托协议书
2014/09/15 职场文书
2015届本科毕业生自我鉴定
2014/09/27 职场文书
完美处理python与anaconda环境变量的冲突问题
2021/04/07 Python
JavaScript实现队列结构过程
2021/12/06 Javascript