JavaScript面向对象中的继承
1.1继承的基本概念
使用一个子类,继承另一个父类,那么子类可以自动拥有父类中的所有属性和方法,这个过程叫做继承。
>>>继承的两方,发生在两个类之间。
实现继承的三种方式:
扩展Object的prototype实现继承、使用call和apply和bind实现继承、使用原型实现继承。
1.2扩展Object的prototype实现继承
扩展Object的prototype实现继承的原理,就是通过循环,将父类对象的所有属性和方法,全部赋给子类对象。关键点在于for-in循环,即使不扩展object,也能通过简单的循环实现操作。
具体实现步骤:
①定义一个父类
function Parent(){}
②定义一个子类
function Son(){}
③通过prototype给object类添加一个扩展方法(通过for-in循环,将父类的属性和方法赋给子类)
Object.prototype.extend = function(parent){
for(var i in parent){
this[i] = parent[i];
}
}
④分别拿到父类对象,和子类对象
var p = new Person();
var s = new Student();
⑤用子类对象,调用扩展方法,实现继承操作
s.extend(p);
完整代码如下:
// 1.定义父类
function Person(name,age){
this.name = name;
this.age = age;
this.say = function(){
alert(this.name+":"+this.age);
}
}
// 2.定义子类
function Student(no){
this.no = no;
this.add = function(a,b){
alert(a+b);
}
}
function Programmer(lang){
this.lang = lang;
this.codding = function(){
alert("我在读书!");
}
}
// 3.通过原型给Object对象添加一个扩展方法。
Object.prototype.customExtend = function(parObj){
for(var i in parObj){
// 通过for-in循环,把父类的所有属性方法,赋值给自己
this[i] = parObj[i];
}
} var p = new Person("张三","18");
var s = new Student("0001");
s.customExtend(p);//现在s继承了p的所有属性和方法。
完整代码
扩展Object的prototype实现继承的缺点:
①无法通过一次实例化,直接拿到完整的子类对象。而需要先拿到父类对象和子类对象两个对象,再手动合并;
②扩展object的继承方法,也会保留在子类对象上。
1.3通过原型实现继承
通过原型实现继承的原理,就是将父类对象,赋值给子类的prototype,那么父类对象的属性和方法就会出现在子类的prototype中。那么,实例化子类时,子类的prototype又会到子类对象的__proto__中,最终,父类对象的属性和方法,会出现在子类对象的__proto__对象中。
具体实现步骤:
①定义一个父类
function Parent(){}
②定义一个子类
function Student(){}
③将父类对象,赋值给子类的prototype
Son.prototype = new Person();
④拿到子类对象,就会将父类对象的所有属性和方法,添加到__proto__
var s = new Son()
完整代码如下:
function Person(name,age){ this.name = name; this.age = age; this.say = function(){ alert("我叫:"+this.name+";今年:"+this.age+"岁"); } } function Student(no){ this.no = no; } Student.prototype=new Person("jh",14); //子类prototype指向父类对象 var stu = new Student(12); stu.say();//继承后,子类获得了父类的全部属性方法
完整代码
通过原型实现继承的特点:
①子类自身的所有属性都是成员属性;父类继承过来的属性都是原型属性。
②依然无法通过一步实例化拿到完成的子类对象。
1.4使用call和apply和bind实现继承
使用call和apply和bind实现继承的作用及区别:
1、三个函数的作用:通过函数名调用这三个函数,可以强行将函数中的this指定为某个对象
2、三个函数的写法(区别):(面试题爱问)
call: func.call(func的this指向的obj,func参数1,func参数2,……);
apply: func.call(func的this指向的obj,[func参数1,func参数2,……]);
bind: func.call(func的this指向的obj)(func参数1,func参数2,……);
3、三个函数的唯一区别,在于接受func的参数列表的方式不同,除此之外,功能上没有任何差异!
具体实现步骤:
①定义一个父类
funtion Parent(){}
②定义子类时,在子类使用三个函数,调用父类,将父类函数的this,指向为子类函数的this
function Son(no,name){
this.no = no;
Person.call(this,name);
}
③实例化子类时,将自动继承父类属性
var s = new Son(12,"zhangsan");
完整代码如下:
function Person(name,age){
this.name = name;
this.age = age;
this.say = function(){
alert("我叫:"+this.name+";今年:"+this.age+"岁");
}
} function Student(no,stuName,stuAge){
this.no = no;
Person.call(this,stuName,stuAge);
// 执行上述代码,相当于把Person类所有this替换为Student类this
// 换言之,也就是把Person类所有属性和方法,全给了Student类
} var stu = new Student(12,"zhangsan",14);
stu.say();// 子类继承了父类say方法
完整代码
好了!今天就给大家分享一下JavaScript面向对象中的继承~~如果有什么疑问,欢迎大家多多留言~~
JavaScript面向对象中的继承的更多相关文章
- Python面向对象中的继承、多态和封装
Python面向对象中的继承.多态和封装 一.面向对象的三大特性 封装:把很多数据封装到⼀个对象中,把固定功能的代码封装到⼀个代码块, 函数,对象, 打包成模块. 这都属于封装思想. 继承:⼦类可以⾃ ...
- javascript面向对象中继承实现?
面向对象的基本特征有:封闭.继承.多态. 在javascript中实现继承的方法: 1.原型链(prototype chaining) 2.call()/apply() 3.混合方式(prototyp ...
- Javascript面向对象(封装、继承)
Javascript 面向对象编程(一):封装 作者:阮一峰 Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程( ...
- JavaScript 面向对象 原型(prototype) 继承
1.对象的概念:无需属性的集合,属性可以为数值,对象或函数,ECMAscript中没有类的概念,这点是javascript与其他面向对象(OO)语言不同的地方. //创建一个自定义对象 var per ...
- 带你理解【JavaScript】中的继承机制
前文 总所周知,继承是所有OO语言中都拥有的一个共性.在JavaScript中,它的继承机制与其他OO语言有着很大的不同,尽管ES6为我们提供了像面向对象继承一样的语法糖,但是其底层依然是构造函数,所 ...
- JavaScript面向对象之类的继承
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- [Go] 实现面向对象中的继承和覆盖方法
go中的继承是使用结构体嵌套实现的,可以继承父类的方法 覆盖和其他面向对象的语言是一样的,函数名,参数,返回类型一致,就可以覆盖父类的方法 package main import "log& ...
- JS中面向对象中的继承(常用写法)---核心部分
1.基本概念 子类继承父类,但是不能影响父类.包括1.混合继承(构造函数+原型) 2.ES6新增class的继承. 接下来介绍,面向对象中继承的两种常用写法.即混合继承(构造函数+原型)和class继 ...
- JavaScript 对象的原型扩展(JS面向对象中的继承)
<script type="text/javascript"> function person(name, age) { this._name = name; this ...
随机推荐
- 易语言 【寻找文本】命令的bug
最近在重写易语言模块的时候,在取子文本操作时老是出错,经常出现一些奇怪的问题,一开始以为是代码问题,可是找半天硬是找不到问题所在. 于是进入了找bug模式,这么几行代码,看了我半个小时,左改右改,总感 ...
- java最全时间类及用法
对于时间类,这篇主要说明各种现实情况下如何取值,怎么定向取值,得到自己想要的时间参数.在java中时间类主要有Date.Calendar,暂时只介绍 java.util.*下的时间类,对于java.s ...
- 框架应用:Spring framework (四) - 事务管理
事务控制 事务是什么?事务控制? 事务这个词最早是在数据库中进行应用,讲的用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位. 事务的管理是指一个事务的开启,内容添加, ...
- Linux 启动详解之init
1.init初探 init是Linux系统操作中不可缺少的程序之一.init进程,它是一个由内核启动的用户级进程,然后由它来启动后面的任务,包括多用户环境,网络等. 内核会在过去曾使用过init的几个 ...
- JavaWeb(一)之细说Servlet
前言 其实javaWeb的知识早就学过了,可是因为现在在搞大数据开发,所以web的知识都忘记了.准备开始慢慢的把Web的知识一点一点的回忆起来,多学一点没有关系,就怕到时候要用的话,什么都不会了. 一 ...
- leetCode没那么难啦 in Java (二)
介绍 本篇介绍的是标记元素的使用,很多需要找到正确元素都可以将正确元素应该插入的位置单独放置一个标记来记录,这样可以达到原地排序的效果. Start 27.RemoveElement 删除指定元 ...
- Spark版wordcount,并根据词频进行排序
import org.apache.spark.{SparkConf, SparkContext}/** * Created by loushsh on 2017/10/9. */object Wor ...
- HAProxy安装文档
HAProxy安装文档 [toc][TOC] 一.环境说明 系统环境:CentOS Linux release 7.2.1511 (Core) 系统内核:3.10.0-327.el7.x86_64 软 ...
- 由 System.arraycopy 引发的巩固:对象引用 与 对象 的区别
作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...
- JavaScript链式调用
1.什么是链式调用? 这个很容易理解,例如 $('text').setStyle('color', 'red').show(); 一般的函数调用和链式调用的区别:链式调用完方法后,return thi ...