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面向对象中的继承的更多相关文章

  1. Python面向对象中的继承、多态和封装

    Python面向对象中的继承.多态和封装 一.面向对象的三大特性 封装:把很多数据封装到⼀个对象中,把固定功能的代码封装到⼀个代码块, 函数,对象, 打包成模块. 这都属于封装思想. 继承:⼦类可以⾃ ...

  2. javascript面向对象中继承实现?

    面向对象的基本特征有:封闭.继承.多态. 在javascript中实现继承的方法: 1.原型链(prototype chaining) 2.call()/apply() 3.混合方式(prototyp ...

  3. Javascript面向对象(封装、继承)

    Javascript 面向对象编程(一):封装 作者:阮一峰 Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程( ...

  4. JavaScript 面向对象 原型(prototype) 继承

    1.对象的概念:无需属性的集合,属性可以为数值,对象或函数,ECMAscript中没有类的概念,这点是javascript与其他面向对象(OO)语言不同的地方. //创建一个自定义对象 var per ...

  5. 带你理解【JavaScript】中的继承机制

    前文 总所周知,继承是所有OO语言中都拥有的一个共性.在JavaScript中,它的继承机制与其他OO语言有着很大的不同,尽管ES6为我们提供了像面向对象继承一样的语法糖,但是其底层依然是构造函数,所 ...

  6. JavaScript面向对象之类的继承

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. [Go] 实现面向对象中的继承和覆盖方法

    go中的继承是使用结构体嵌套实现的,可以继承父类的方法 覆盖和其他面向对象的语言是一样的,函数名,参数,返回类型一致,就可以覆盖父类的方法 package main import "log& ...

  8. JS中面向对象中的继承(常用写法)---核心部分

    1.基本概念 子类继承父类,但是不能影响父类.包括1.混合继承(构造函数+原型) 2.ES6新增class的继承. 接下来介绍,面向对象中继承的两种常用写法.即混合继承(构造函数+原型)和class继 ...

  9. JavaScript 对象的原型扩展(JS面向对象中的继承)

    <script type="text/javascript"> function person(name, age) { this._name = name; this ...

随机推荐

  1. Spark Streaming socketTextStream简单demo

    正文 SparkStreaming的入口是StreamingContext,通过scala实现 一个简单的实时获取数据.代码SparkStreaming官网也可以找到. object SocketDS ...

  2. python 实现注册程序

    本文介绍用python实现一个模拟注册的程序,详细需求如下: # 写一个注册的程序,输入username,密码,密码确认,输入的账号和密码不能为空,两次输入密码必须一致,用户名不能重复,错误次数4次# ...

  3. vue2.0动态绑定图片src属性值初始化时报错

    在vue2.0中,经常会使用类似这样的语法 v-bind:src = " imgUrl "(缩写 :src = " imgUrl "),看一个案例 <te ...

  4. Django中的信号及其用法

    Django中提供了"信号调度",用于在框架执行操作时解耦. 一些动作发生的时候,系统会根据信号定义的函数执行相应的操作 Django中内置的signal Model_signal ...

  5. JavaScript中的位置屬性

    屏幕中的位置(直接使用,無需前綴): screenLeft.screenTop:除了火狐都支持 screenX.screenY: 窗口的大小(谷歌的inner=outer,直接使用,無需前綴): in ...

  6. JVM菜鸟进阶高手之路三

    转载请注明原创出处,谢谢! 笨神大大分享: 小程序里面搜索:JVMPocket,这个小程序是笨神大大提供的,里面可以搜索相关JVM参数,用法. -XX:MaxTenuringThreshold,这个参 ...

  7. 再说AutoComplete

    一.简述 昨天support一同事,帮她的客户做类似下面的效果(自动完成): 以前在搜房的时候,弄过这个,调用楼盘字典: 这是一个小功能,也是一个大功能.因为它可以做大,也可以做小. 二.搜房的Aut ...

  8. 一张图讲解对象锁和关键字synchronized修饰方法

    每个对象在出生的时候就有一把钥匙(监视器),那么被synchronized 修饰的方法相当于给方法加了一个锁,这个方法就可以进行同步,在多线程的时候,不会出现线程安全问题. 下面通过一张图片进行讲解: ...

  9. 项目管理软件之争,禅道和JIRA大对比

    本文摘要: 一. 产品介绍 二. 界面设计 1. 界面颜色设计 2. 布局结构 三. 功能区别 四. 价格对比 五. 后期服务 六. 优缺点 七. 总结 说到项目管理软件,不得不提的是禅道和JIRA. ...

  10. vuejs2+axios设置

    http://www.cnblogs.com/wisewrong/p/6402183.html 1 当前项目安装axios $ cnpm i axios --save-dev 2 import axi ...