第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继承的实现方式 既然要实现继承,那么首先我们得有一个父类,代码如下: // 定义一个 ...
随机推荐
- 2016-2017-2 《Java程序设计》第二周学习总结
20155319 2016-2017-2 <Java程序设计>第二周学习总结 课堂学习内容 git:版本控制 java -d bin(当地文件夹) src/Hello.java把生成的.c ...
- 《Java 程序设计》课堂实践项目-命令行参数
<Java 程序设计>课堂实践项目 课后学习总结 目录 改变 命令行参数实验要求 课堂实践成果 课后思考 改变 修改了博客整体布局,过去就贴个代码贴个图很草率,这次布局和内容都有修改.加了 ...
- 20145226夏艺华 《Java程序设计》预备作业3
安装虚拟机 上学期开学的时候就安装了Linux虚拟机,由于我的是Mac OS,所以和windows下的安装有所不同. 我使用的是VirtualBoxVM虚拟机,稳定性还不错,需要的同学可以从https ...
- [FJOI2014]最短路径树问题 长链剖分
[FJOI2014]最短路径树问题 LG传送门 B站传送门 长链剖分练手好题. 如果你还不会长链剖分的基本操作,可以看看我的总结. 这题本来出的很没水平,就是dijkstra(反正我是不用SPFA)的 ...
- php实现快速排序和冒泡排序
快速排序 实现思路:把第一个元素作为标记,依次判断后续的值,如果小于它则放在左边,如果大于它则放右边,同理把左右两部分看成一个整体一直递归,最后再数组拼接起来 它的最优时间复杂度为O(nlogn)[以 ...
- 初探C#
初探.NET底层原理 学习C#离不开.net平台,因为微软的开发平台真的是太强大了,它为每一个开发者都做了太多太多,但是我们不仅要知道怎么用,而且也应该知道其中的内部到底包含了什么.本篇文章不仅讲一些 ...
- 近中期3D编程研究目标
近几年一直在用业余时间研究3D编程,研究的中期目标是建立一个实用的开源3D编程框架.3D编程技术最直接的应用是开发游戏,所以3D编程框架也就是3D游戏开发框架.在我看来,游戏是否好玩的关键是能否为玩家 ...
- Spring Cloud(三):服务提供与调用 Eureka【Finchley 版】
Spring Cloud(三):服务提供与调用 Eureka[Finchley 版] 发表于 2018-04-15 | 更新于 2018-05-07 | 上一篇文章我们介绍了 Eureka 服务 ...
- R-CNN学习总结
R-CNN是一个比较早期的用于目标检测方法,但却十分经典,在此结合论文对这一方法做一个总结. (写给小白:通过下图简单理解图像分类,图像定位,目标检测和实例分割) R-CNN方法提出的背景: 1.近1 ...
- Tensorflow - Implement for a Softmax Regression Model on MNIST.
Coding according to TensorFlow 官方文档中文版 import tensorflow as tf from tensorflow.examples.tutorials.mn ...