js继承的几种方法和es6继承方法
一、原型链继
1.基本思想
利用原型链来实现继承,超类的一个实例作为子类的原型
2、具体实现
function F() {}
//原型属性,原型方法:
F.prototype.name="Lee";
F.prototype.age=33;
F.prototype.run=function(){
return this.name+" "+this.age+" running";
}
var f = new F();
console.log(f.name);
console.log(f.run);
3.优缺点
1)优点
简单明了,容易实现
实例是子类的实例,实际上也是父类的一个实例
父类新增原型方法/原型属性,子类都能访问到
2)缺点
所有子类的实例的原型都共享同一个超类实例的属性和方法
无法实现多继承
在创建子类的实例时 不能向父类的构造函数传递参数
二、构造函数继承
1。基本思想
通过使用call、apply方法可以在新创建的对象上执行构造函数,用父类的构造函数来增加子类的实例
2、具体实现
function F() {
// 属性
this.name = name || ‘dragon’;
// 实例方法
this.sleep = function(){
console.log(this.name + '正在睡觉!');
}
}
function C(name){
F.call(this);
this.name = name || 'Tom';
}
var c=new C()
console.log(f.name);
console.log(f.sleep);
3.优缺点
1)优点
简单明了,直接继承超类构造函数的属性和方法
2)缺点
无法继承原型链上的属性和方法
三、实例继承
1.基本思想
为父类实例添加新特性,作为子类实例返回
具体实现
function F() {
// 属性
this.name = name || 'Animal';
// 实例方法
this.sleep = function(){
console.log(this.name + '睡觉');
}
}
function C(name){
var instance = new F();
instance.name = name || 'Tom';
return instance;
}
var c = new C();
console.log(c.name);
console.log(c.sleep());
特点:
1. 不限制调用方式,不管是new 子类()还是子类(),返回的对象具有相同的效果
缺点:
1. 实例是父类的实例,不是子类的实例
2. 不支持多继承
四、组合继承
1.基本思想
利用构造继承和原型链组合
2.具体实现
function F() {
// 属性
this.name = name || 'Animal';
// 实例方法
this.sleep = function(){
console.log(this.name + '正在睡觉!');
}
}
function C(name){
F.call(this);//构造函数继承
this.name = name || 'Tom';
}
C.prototype = new F();//原型继承
var q=new C();
console.log(q.name);
console.log(q.sleep());
3.优缺点
1)优点
解决了构造继承和原型链继承的两个问题
2)缺点
实际上子类上会拥有超类的两份属性,只是子类的属性覆盖了超类的属性
五、原型式继承
1.基本思想
采用原型式继承并不需要定义一个类,传入参数obj,生成一个继承obj对象的对象
2、具体实现
var obj = {
name: "qw",
age: "12",
ada:"asd"
}
function F(o) {
function C() {}
C.prototype = o;
return new C();
}
var q= F(obj)
console.log(q.name);
console.log(q.age);
3.优缺点
1)优点:
直接通过对象生成一个继承该对象的对象
2)缺点:
不是类式继承,而是原型式基础,缺少了类的概念
六、寄生式继承
原型式+工厂模式
解决了组合继承两次调用构造函数的问题
1.基本思想
创建一个仅仅用于封装继承过程的函数,然后在内部以某种方式增强对象,最后返回对象
2、具体实现
//临时中转函数
function obj(o) {
function F() {}
F.prototype = o;
return new F();
}
//寄生函数
function create(o){
var q= obj(o);
//可以对f进行扩展
q.sleep = function(){
return this.name+”睡觉”;
}
return q;
}
var box = {
name: 'Lee',
age: 100,
family: ['Dad', 'Mom', 'Sister']
};
var box1 = create(box);
alert(box1.name);
alert(box1.run());
3.优缺点
1)优点:
* 原型式继承的一种拓展
2)缺点:
* 依旧没有类的概念
七、寄生组合继承
通过调用构造函数来继承属性,通过原型链混成形式继承方法,与组合继承不同之处在于子类型只继承了超类型原型的一个副本,并未继承其构造函数。因此只需要调用一次超类型构造函数。
1.基本思想
结合寄生式继承和组合式继承,完美实现不带两份超类属性的继承方式
2.具体实现
//临时中转函数
function obj(o) {
function F() {}
F.prototype = o;
return new F();
}
//寄生函数
function create(box,desk){
var q = obj(box.prototype);
q.construtor=d;
d.prototype=q;
}
function B(name,age){
this.name=name;
this.age=age;
}
B.prototype.run=function(){
return this.name + " " + this.age + " running..."
}
function D(name,age){
Box.call(this,name,age);
}
//通过寄生组合继承来实现
create(B,D);//替代D.prototype=new B();
var d= new D('Lee',100);
alert(d.run());
3.优缺点
1)优点:
完美实现继承,解决了组合式继承带两份属性的问题
2)缺点:
过于繁琐,故不如组合继承
Es6. 继承
lass father{
constructor(name){
this.name=name
this.names=[1,2,3]
}
getname(){
console.log(this.name);
}
}
class child extends father{
constructor(name){
super(name);
}
sayHello(){
console.log("sayHello");
}
static hh(){
console.log("hh")
}
}
var cc=new child("juanjuan");
cc.sayHello();
cc.getname(); //juanjuan
child.hh(); //hh
cc.names.push("wqwq");
var c1=new child("sasasa");
console.log(c1.names) //[1,2,3]
后续。。。。。。
js继承的几种方法和es6继承方法的更多相关文章
- 杨柳絮-Info:对抗杨柳絮的7种方法和2种防治手段
ylbtech-杨柳絮-Info:对抗杨柳絮的7种方法和2种防治手段 园林养护人员在对抗杨柳絮上 主要有以下两种方法↓↓ 1.化学方法 化学方法是通过激素等调节剂来抑制植物发芽分化,达到减少杨柳开花的 ...
- Html.Partial方法和Html.RenderPartial方法
分布视图 PartialView 一般是功能相对独立的,类似用户控件的视图代码片段,可以被多个视图引用,引用方式如下. 1,Html.Partial方法和Html.RenderPartial方法 静态 ...
- $(document).ready()即$()方法和window.onload方法的比较
以浏览器装载文档为例,我们都知道在页面完毕后,浏览器会通过JavaScript为DOM元素添加事件.在常规的JavaScript代码中,通常使用window.onload方法,而在jQuery中,使用 ...
- Server.Transfer方法,Server.Execute方法和Response.Redirect方法有什么异同
(1)Server.Transfer方法: Server.Transfer("m2.aspx");//页面转向(服务器上执行). 服务器停止解析本页,保存此页转向前的数据后,再使页 ...
- java——多线程——单例模式的static方法和非static方法是否是线程安全的?
单例模式的static方法和非static方法是否是线程安全的? 答案是:单例模式的static方法和非static方法是否是线程安全的,与单例模式无关.也就说,如果static方法或者非static ...
- synchronized 修饰在 static方法和非static方法的区别
Java中synchronized用在静态方法和非静态方法上面的区别 在Java中,synchronized是用来表示同步的,我们可以synchronized来修饰一个方法.也可以synchroniz ...
- $(document).ready()方法和window.onload()方法
$(document).ready()方法和window.onload()方法 $(document).ready()方法是JQuery中的方法,他在DOM完全就需时就可以被调用,不必等待这些元素关联 ...
- tornado的IOLoop.instance()方法和IOLoop.current()方法区别
在使用tornado时,经常有人疑惑IOLoop.instance()方法和IOLoop.current()方法的区别是什么. IOLoop.instance() 返回一个全局 IOLoop实例. 大 ...
- 【转载】C#中double.TryParse方法和double.Parse方法的异同之处
在C#编程过程中,double.TryParse方法和double.Parse方法都可以将字符串string转换为double类型,但两者还是有区别,最重要的区别在于double.TryParse方法 ...
随机推荐
- 洛谷P1966 火柴排队(逆序对)
题意 题目链接 Sol 不算很难的一道题 首先要保证权值最小,不难想到一种贪心策略,即把两个序列中rank相同的数放到同一个位置 证明也比较trivial.假设\(A\)中有两个元素\(a, b\), ...
- 软件项目技术点(8)—— canvas调用drawImage绘制图片
AxeSlide软件项目梳理 canvas绘图系列知识点整理 html5中标签canvas,函数drawImage(): 使用drawImage()方法绘制图像.绘图环境提供了该方法的三个不同版本 ...
- 深入理解Javascript之执行上下文(Execution Context)
在这篇文章中,将比较深入地阐述下执行上下文 - Javascript中最基础也是最重要的一个概念.相信读完这篇文章后,你就会明白javascript引擎内部在执行代码以前到底做了些什么,为什么某些函数 ...
- ASP.NET全局异常处理
Web项目部署后,异常直接暴露给用户会产生很不好的体验.只是暴露在服务器端又无法实时记录异常原因以便加以重现并修复.所以配合Log4Net记录日志信息,同时全局异常处理来营造良好用户体验就比较重要了. ...
- android 自定义
初级: 1.Android自定义View之一:初探实例 ——> onDraw 2.getwidth和getmeasuredwidth的区别以及两者的使用场景 3.Android 自定义View ...
- python:Non-ASCII character ‘\xe2′ in file
python 2.7系列的 在运行.py文件时 报错python:Non-ASCII character ‘\xe2′ in file 解决办法: 在文件顶部 加入 # coding: utf ...
- 安装字体或直接调用非注册字体 z
1.安装字体//程序直接将字体文件安装的系统中.函数声明:[DllImport("kernel32.dll", SetLastError = true)] static exter ...
- Linux下创建vue项目
前提:已经安装了node.js.cnpm 1.全局安装vue脚手架vue-cli:#cnpm install -g vue-cli 注意:全局安装没有建立软链接前是无法使用刚刚安装的vue命令的,所以 ...
- 防止HTML出现滚动条时页面的抖动
<html> <style> * { padding: 0; margin: 0; } body { font: 40px fantasy; } .container { wi ...
- 广义线性模型(GLM, Generalized Linear Model)
引言:通过高斯模型得到最小二乘法(线性回归),即: 通过伯努利模型得到逻辑回归,即: 这些模型都可以通过广义线性模型得到.广义线性模型是把自变量的线性预测函数当作因变量的估计值.在 ...