一、构造函数方式

 //构造函数
function People(){
this.race = '汉族';
}
People.prototype={
eat:function(){
console.log('123');
}
} /*学生对象*/
function Student(name, skin) {
People.apply(this, arguments);
this.name = name;
this.skin = skin;
}
//实例化
var zhangsan = new Student('张三', '黄皮肤')
console.log(zhangsan.name); //张三
console.log(zhangsan.race); //汉族
zhangsan.eat();//报错
//原因:无法继承person原型对象中的方法

二、原型对象实现继承

 //基类
var Person = function(){
this.name = '张三';
this.age = 20;
}
Person.prototype = {
say : function(){
console.log('Person.prototype - say');
}
} //构造函数
var Student = function(name,age,sex){
this.sex = sex;
}
//学生继承person,则拥有person原型中的方法
Student.prototype = new Person();
Student.prototype.getTeacher = function(){
console.log('Student.prototype.getTeacher');
} //测试 -- 学生类拥有了person中的方法
var xiaoWang = new Student('小王',10,'男');
//xiaoWang.name = '张三'
console.log(xiaoWang.name);//张三
xiaoWang.say();//Person.prototype - say
xiaoWang.getTeacher();//Student.prototype.getTeacher /*存在的问题*/
/*无法通过传参数定义对象*/
console.log(xiaoWang.name);//张三
console.log(xiaoWang.age);// /*解决方式*/
xiaoWang.name = '小明';
xiaoWang.age = 22;
console.log(xiaoWang.name);//小明
console.log(xiaoWang.age);//

三、组合方式(构造函数+原型)

 function Person(name, age) {
this.name=name;
this.age=age;
}
Person.prototype.say = function () {
console.log("我是"+this.name);
} function Student(name, age, no) {
/*会自动调用Person的方法,同时将name age传递过去*/
Person.call(this,name,age);
//自己的属性
this.no = no;
}
Student.prototype = new Person();
var stu1 = new Student("小明",22,123);
console.log(stu1.name);//小明
console.log(stu1.say());//我是小明
console.log(stu1.no);//

四、寄生组合式

 /*继承的固定函数*/
function inheritPrototype(subType,superType){
var prototype = Object(superType.prototype);
prototype.constructor = subType;
subType.prototype = prototype;
} function Person(name){
this.name = name;
}
Person.prototype.say= function(){
console.log("我是"+this.name);
} function Student(name,age){
Person.call(this,name);
this.age = age;
} inheritPrototype(Student,Person);
var xiaozhang = new Student('小张',20);
console.log(xiaozhang.name);//小张
xiaozhang.say();//我是小张

五、拷贝方式

 var Chinese = {nation:'中国'};
var Doctor ={career:'医生'} // 请问怎样才能让"医生"去继承"中国人",也就是说,我怎样才能生成一个"中国医生"的对象?
// 这里要注意,这两个对象都是普通对象,不是构造函数,无法使用构造函数方法实现"继承"。 function extend(p) {
var c = {};
for (var i in p) {      
c[i] = p[i];    
}
c.uber = p;
return c;
} var Doctor = extend(Chinese);
Doctor.career = '医生';
alert(Doctor.nation); // 中国

六、继承的框架

1、base2.js

 <script src='base2.js'></script>
<script>
/*基类*/
var Person = Class.extend ( {
init: function (name ) {
this.name = name;
},
dance: function ( ) {
alert('跳舞');
}
} ); /*子类*/
var Student = Person.extend({
init: function(){
//false表示什么意思
this._super( false );
},
/*重写父类方法*/
dance: function(){
/*调用父类*/
this._super();
alert('唱歌');
},
/*实现自己的方法*/
swingSword: function(){
return true;
}
}); var xiaozhang = new Student();
xiaozhang.dance();
</script>

2、simple.js

 <script src='simple.js'></script>
<script>
var Person = Class.extend({
init: function(age,name){
this.age = age;
this.name = name;
},
dance: function(){
alert("跳舞");
}
});
var Student = Person.extend({
init: function(age,name,height){
this._super(age,name);
this.height = height;
},
dance: function(){
/*调用父类的同名方法*/
this._super();
/*同时又可以调用自己的方法*/
alert("唱歌");
}
}); var xiaozhang = new Student(21,'小张','121');
xiaozhang.dance();
</script>

七、对象继承实现计算周长

 var sharp = function(name){
this.name = name;
}
sharp.prototype = {
//改方法被继承,这个方法是大家都有的,并且都一样,可以放在基类中
getName : function(){
return this.name;
}
//会根据不同的形状而被重写
,zhouchang : function(){
return 100;
}
}; //矩形对象
var Rectangle = function(length,width){
sharp.call(this, name);
this.name='矩形';
this.length =length;
this.width = width;
}
//重写计算周长的方法
Rectangle.prototype = new sharp();
Rectangle.prototype.zhouchang = function(){
return (this.length + this.width) * 2;
} //好处
//以后新增一个计算其他形状的需求,不用修改原来的代码,只需要扩充即可.
//新增一个正方形
var Square = function(length){
sharp.call(this, name);
this.name='正方形';
this.length =length;
//this.width = width;
}
//重写计算周长的方法
Square.prototype = new sharp();
Square.prototype.zhouchang = function(){
return this.length * 4;
} //新增一个圆形
var Circle = function(radius){
sharp.call(this, name);
this.name='圆形';
this.radius =radius;
//this.width = width;
} //重写计算周长的方法
Circle.prototype = new sharp();
Circle.prototype.zhouchang = function(){
//圆的周长=2×圆周率×半径 或 圆周率×直径
return 2 * Math.PI * this.radius;
} //使用对象 封装
function computezhouchang(shape) {
alert( shape.getName() + '的周长是' + shape.zhouchang() );
} //组装世界
//var rectangle = new Rectangle('矩形',10,20);
//computezhouchang(rectangle); //去掉属性name
var rectangle = new Rectangle(10,20);
computezhouchang(rectangle); //正方形
var square = new Square(10);
computezhouchang(square); //圆形
var circle = new Circle(10);
computezhouchang(circle);

第201天:js---实现继承的5种方式的更多相关文章

  1. js实现继承的5种方式 (笔记)

    js实现继承的5种方式 以下 均为 ES5 的写法: js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承 ...

  2. js 实现继承的几种方式

    //js中实现继承的几种方式 //实现继承首先要有一个父类,先创造一个动物的父类 function Animal(name){ this.name = name; this.shoot = funct ...

  3. js 实现继承的6种方式(逐渐优化)

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  4. js实现继承的两种方式

    这是面试时面试官会经常问到问题: js的继承方式大致可分为两种:对象冒充和原型方式: 一.先说对象冒充,又可分为3种:临时属性方式.call().apply(): 1.临时属性方式: 当构造对象son ...

  5. js实现继承的5种方式

    js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承有以下通用的几种方式1.使用对象冒充实现继承(该种实现 ...

  6. 深入浅出js实现继承的7种方式

    给大家介绍7中js继承的方法 有些人认为JavaScript并不是真正的面向对象语言,在经典的面向对象语言中,您可能倾向于定义类对象,然后您可以简单地定义哪些类继承哪些类(参考C++ inherita ...

  7. JS实现继承的几种方式

    前言 JS作为面向对象的弱类型语言,继承也是其非常强大的特性之一.那么如何在JS中实现继承呢?让我们拭目以待. JS继承的实现方式 既然要实现继承,那么首先我们得有一个父类,代码如下: // 定义一个 ...

  8. JavaScript面向对象(三)——继承与闭包、JS实现继承的三种方式

      前  言 JRedu 在之前的两篇博客中,我们详细探讨了JavaScript OOP中的各种知识点(JS OOP基础与JS 中This指向详解 . 成员属性.静态属性.原型属性与JS原型链).今天 ...

  9. JS实现继承的几种方式(转)

    转自:幻天芒的博客 前言 JS作为面向对象的弱类型语言,继承也是其非常强大的特性之一.那么如何在JS中实现继承呢?让我们拭目以待. JS继承的实现方式 既然要实现继承,那么首先我们得有一个父类,代码如 ...

  10. JS实现继承的几种方式以及优缺点(转载)

    前言 JS作为面向对象的弱类型语言,继承也是其非常强大的特性之一.那么如何在JS中实现继承呢?让我们拭目以待. JS继承的实现方式 既然要实现继承,那么首先我们得有一个父类,代码如下: // 定义一个 ...

随机推荐

  1. Linux入门进阶第三天——软件安装管理(下)

    一.yum在线安装 之前的rpm包各种依赖性太强!安装复杂,yum的好处就来了: // yum 在redhat是付费服务 1.yum源文件 先进入到yum目录: 我们打开默认生效的Base包 2.光盘 ...

  2. 20155220 2016-2017-2 《Java程序设计》第八周学习总结

    20155220 2016-2017-2 <Java程序设计>第八周学习总结 教材学习内容总结 第14章 NIO与NIO2 NIO简介 NIO使用频道来衔接数据结点,在处理数据时,NIO可 ...

  3. 安装虚拟机和Linux系统的学习

    安装虚拟机和Linux系统的学习(随笔3) 1.安装虚拟机 首先我按着老师给的链接上的步骤一步一步安装VirtualBox,进行得十分顺利. 接着则是在虚拟机上安装Ubuntu. 然而安装完成以后按要 ...

  4. QT-2D编程

    QT-[转]2D编程 Qt中提供了强大的2D绘图系统,可以使用相同的API在屏幕上和绘图·设备上进行绘制,主要基于QPainter.QPainterDevice和QPainterEngine这3个类. ...

  5. Linux 安装ActiveMQ(使用Mac远程访问)

    阅读本文需要安装JDK 一 ActiveMQ简介 activemq是用java语言编写的一款开源消息总线 activemq是apache出品 activemq消息的传递有两种类型 一种是点对点: 即一 ...

  6. 搭建docker 私有镜像仓库

    前期准备 服务器:centos 7.3 docker-ce: 18.06.1-ce docker-compose: 1.22.0 docker 安装 首先,更新系统 yum update yum up ...

  7. vim—多行注释、取消多行注释

    多行注释 命令模式: (1)将光标放在要注释的行首,按下组合键ctrl + v ,然后按上下键选取要注释的行. (2)按下大i键,然后插入要注释的符号 # (3)按ESC键,退出后,就会全部注释. 取 ...

  8. ORA-28000: the account is locked 查哪个具体ip地址造成

    查系统默认的策略,连续验证10次错误帐户即会被锁 SQL> select resource_name, limit from dba_profiles where profile='DEFAUL ...

  9. 两张神图介绍python3和 2.x与 3.x 的区别

    有感与第一张图, 做了第二张图.

  10. 欢迎来怼-----Beta冲刺贡献分数分配结果

    队名:欢迎来怼 小组成员 队长:田继平 成员:李圆圆,葛美义,王伟东,姜珊,邵朔,阚博文