第201天:js---实现继承的5种方式
一、构造函数方式
//构造函数
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种方式的更多相关文章
- js实现继承的5种方式   (笔记)
		
js实现继承的5种方式 以下 均为 ES5 的写法: js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承 ...
 - js 实现继承的几种方式
		
//js中实现继承的几种方式 //实现继承首先要有一个父类,先创造一个动物的父类 function Animal(name){ this.name = name; this.shoot = funct ...
 - js 实现继承的6种方式(逐渐优化)
		
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...
 - js实现继承的两种方式
		
这是面试时面试官会经常问到问题: js的继承方式大致可分为两种:对象冒充和原型方式: 一.先说对象冒充,又可分为3种:临时属性方式.call().apply(): 1.临时属性方式: 当构造对象son ...
 - js实现继承的5种方式
		
js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承有以下通用的几种方式1.使用对象冒充实现继承(该种实现 ...
 - 深入浅出js实现继承的7种方式
		
给大家介绍7中js继承的方法 有些人认为JavaScript并不是真正的面向对象语言,在经典的面向对象语言中,您可能倾向于定义类对象,然后您可以简单地定义哪些类继承哪些类(参考C++ inherita ...
 - JS实现继承的几种方式
		
前言 JS作为面向对象的弱类型语言,继承也是其非常强大的特性之一.那么如何在JS中实现继承呢?让我们拭目以待. JS继承的实现方式 既然要实现继承,那么首先我们得有一个父类,代码如下: // 定义一个 ...
 - JavaScript面向对象(三)——继承与闭包、JS实现继承的三种方式
		
前 言 JRedu 在之前的两篇博客中,我们详细探讨了JavaScript OOP中的各种知识点(JS OOP基础与JS 中This指向详解 . 成员属性.静态属性.原型属性与JS原型链).今天 ...
 - JS实现继承的几种方式(转)
		
转自:幻天芒的博客 前言 JS作为面向对象的弱类型语言,继承也是其非常强大的特性之一.那么如何在JS中实现继承呢?让我们拭目以待. JS继承的实现方式 既然要实现继承,那么首先我们得有一个父类,代码如 ...
 - JS实现继承的几种方式以及优缺点(转载)
		
前言 JS作为面向对象的弱类型语言,继承也是其非常强大的特性之一.那么如何在JS中实现继承呢?让我们拭目以待. JS继承的实现方式 既然要实现继承,那么首先我们得有一个父类,代码如下: // 定义一个 ...
 
随机推荐
- 20155336 《Java程序设计》实验一(Java开发环境的熟悉)实验报告
			
20155336 <Java程序设计>实验一(Java开发环境的熟悉)实验报告 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Jav ...
 - # 20155337 《Android程序设计》实验四实验报告
			
20155337 <Android程序设计>实验四实验报告 实验一 实验内容 Android Stuidio的安装测试: 参考<Java和Android开发学习指南(第二版)(EPU ...
 - installshield 判断mdmcpq.inf和usbser.sys 是否 存在
			
1.产品上位机程序,需要驱动支持,在安装 exe程序的时候,连同NET框架4.0和 .inf驱动文件,一起安装, 安装驱动的时候,会发现, 如果系统 C:\Windows\Inf 缺少mdmcpq. ...
 - BZOJ2039_employ人员雇佣_KEY
			
题目传送门 网络流,求最小割. 设tot为所有盈利的和,即所有人(不花钱)雇佣. 对于S->i建一条容量为c[i]的边,i->j建一条S[i][j]*2的边,之所以这样建是因为如果不选这个 ...
 - day 6 返回值,参数
			
1.函数返回值 In [3]: def divid(a,b): ...: shang = a//b ...: yushu = a%b ...: return shang,yushu ...: In [ ...
 - centos7下mysql 开启远程登录
			
安装mysql 安装mysql就不做过多的介绍了,相信小伙伴们都可以很轻松的安装 进入mysql命令行 mysql -u用户名 -p密码 新建远程登录的用户 grant all on *.* to a ...
 - Java中如何创建一个确保唯一的名字,文件名
			
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客要讲的有,如何创建一个唯一的文件名,创建一个唯一的String字符串 为什么要创建唯一呢?再很多情况下 ...
 - protobuf工程的编译以及使用
			
一. 获取Protocol Buffer 1.1 获得源码 Github:ProtocolBuffer源码 Git clone之:git clone https://github.com/google ...
 - 根据xml生成相应的对象类
			
根据xml生成相应的class对象,听起来很难其实很简单,用xsd.exe就能办到 打开vs 命令行运行xsd.exe 你的xml文件地址 空格/outputdir:存放xsd的地址 ok,这是生成了 ...
 - python全栈开发-前方高能-函数
			
python_day_9 一.今日主要内容 函数: 函数:对功能的封装 语法: def 函数名(形参): 函数体 函数名(实参) 函数名:命名规则和变量一样 函数的返回值: return, 函数执行完 ...