第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继承的实现方式 既然要实现继承,那么首先我们得有一个父类,代码如下: // 定义一个 ...
随机推荐
- sort与qsort的异同
主要内容: 1.qsort的用法 2.sort的用法 3.qsort和sort的区别 qsort的用法: 原 型: void qsort(void *base, int nelem, int widt ...
- 【LG3238】 [HNOI2014]道路堵塞
题目描述 给你一张\(N\)个点.\(M\)条边的有向图,按顺序给定你一条有\(L\)条边的\(1\rightarrow n\)的最短路, 每次断掉这\(L\)条边中的一条(不对后面答案产生影响),求 ...
- 4825: [Hnoi2017]单旋
4825: [Hnoi2017]单旋 链接 分析: 以后采取更保险的方式写代码!!!81行本来以为不特判也可以,然后就总是比答案大1,甚至出现负数,调啊调啊调啊调~~~ 只会旋转最大值和最小值,以最小 ...
- itchat个人练习 语音与文本图灵测试例程
背景介绍 itchat是一个开源的微信个人号接口,使用python调用微信从未如此简单. 使用不到三十行的代码,你就可以完成一个能够处理所有信息的微信机器人. 官方文档参考https://itchat ...
- nexus实现从windows迁移至Linux平台
说明: 由于老环境是在本地windows 2008 R2里面搭建的nexus,前面搭建了jenkins,需要将maven私库迁移至云服务器的CentOS 7系统下,之前没做过nexus的迁移,在网上看 ...
- dubbo SpringContainer
dubbo SpringContainer Spring启动类容器 SPI service provider interfaces 服务提供借口 Singleton 单例 ThreadSafe 线程安 ...
- java之接口开发-初级篇-socket通信
socket通信实现util包类实现 public class SocketThread extends Thread { public void run() { while (true) { // ...
- Linux sync命令的作用分析
Sync命令 在用reboot命令启动unix系统后,系统提示出错信息,部分应用程序不能正常工作.经仔细检查系统文件,并和初始的正确备份进行比较,发现某些文件确实被破坏了,翻来覆去找不到文件遭破坏 ...
- Python20-Day02
1.数据 数据为什么要分不同的类型 数据是用来表示状态的,不同的状态就应该用不同类型的数据表示: 数据类型 数字(整形,长整形,浮点型,复数),字符串,列表,元组,字典,集合 2.字符串 1.按索引取 ...
- Python 并行分布式框架:Celery 超详细介绍
本博客摘自:http://blog.csdn.net/liuxiaochen123/article/details/47981111 先来一张图,这是在网上最多的一张Celery的图了,确实描述的非常 ...