//1.原型继承
  //缺点: 当父级的属性有引用类型的时候,任意一个实例修改了这个属性,其他实例都会受影响
   // 1)基本类型:Number Boolean String undefined null
   // 2)引用类型:Object Function
function Person(){
this.class = '人';
this.name = '张三';
this.say = function(){
console.log(this.name);
}
};

function Man(name,age){
this.name = name;
this.age = age;
};
Man.prototype = new Person();
var man = new Man('广发',18);
console.log(man);

  //2.借用构造函数继承
    //缺点:父类的方法会被创建多次
function Person(){
this.class = '人类';
this.say = function(){
console.log('我是人类');
}
}
function Man(name,age){
this.name = name;
this.age = age;
//借用构造函数
Person.call(this);
}
var man = new Man('广发',18);
console.log(man);
var man2 = new Man('广发',20);
console.log(man.say===man2.say);//false

  //3寄生式继承
function Person(o){ //参数o是一个传进来的对象
缺点:没用到原型,无法复用
var obj = Object.create(o);
//console.log(obj._proto_ === o); //false
obj.class = '人类';
obj.say = function(){
console.log(this.name);
}
return obj;
}
//要传入的对象
var aman = {
name:'广发',
age:100
}
var man = Person(aman);
console.log(man);

  //4.组合式继承
    //唯一缺点:父类的构造器被调用了两次
function Father(){ //父级
this.class = '人类';
alert('测试被调用多少次');
};

Father.prototype.say = function(){ //把方法放到原型里
console.log(this.name);
}
function Child(name,age){
this.name = name;
this.age = age;
Father.call(this);//借用构造函数
}
Child.prototype = new Father();//Child原型继承了Father,这样就可以调用原型里面的方法了
var man = new Child('广发',18);
console.log(man);
var man2 = new Child('广发',20);
console.log(man.say === man2.say);//true,因为在原型里面都能调用,所以他们这个方法是相等的

  // 5 终极版 寄生组合式继承
    //什么?缺点?你信不信我打你
function Person(){
this.class = '人类';
alert('测试调用了几次');
}
Person.prototype.say = function(){
console.log(this.name);
}
Man.prototype = Object.create(Person.prototype);
function Man(name,age){
this.name = name;
this.age = age;
Person.call(this);
}
var man = new Man('广发',18);
console.log(man);

有时候玩着玩着就找不到原型构造器了,所以我们要重新找回构造器

//构造器重定向(找回构造器)
Man.prototype.constructor = Man;

1. 每个函数都包含两个非继承而来的方法:call()方法和apply()方法。

2. 相同点:这两个方法的作用是一样的。

都是在特定的作用域中调用函数,等于设置函数体内this对象的值,以扩充函数赖以运行的作用域。

一般来说,this总是指向调用某个方法的对象,但是使用call()和apply()方法时,就会改变this的指向。

说明: call方法可以用来代替另一个对象调用一个方法,call方法可以将一个函数的对象上下文从初始的上下文改变为thisObj指定的新对象,如果没有提供thisObj参数,那么Global对象被用于thisObj。

简单明了

 apply:调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.apply(A, arguments);即A对象应用B对象的方法。
call:调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.call(A, args1,args2);即A对象调用B对象的方法。

js五种继承优缺点的更多相关文章

  1. js一种继承机制:用对象冒充继承构造函数的属性,用原型prototype继承对象的方法。

    js一种继承机制:用对象冒充继承构造函数的属性,用原型prototype继承对象的方法. function ClassA(sColor) { this.color = sColor; } ClassA ...

  2. js 五种绑定彻底弄懂this,默认绑定、隐式绑定、显式绑定、new绑定、箭头函数绑定详解

     壹 ❀ 引 可以说this与闭包.原型链一样,属于JavaScript开发中老生常谈的问题了,百度一搜,this相关的文章铺天盖地.可开发好几年,被几道this题安排明明白白的人应该不在少数(我就是 ...

  3. JS五种绑定彻底弄懂this,默认绑定、隐式绑定、显式绑定、new绑定、箭头函数绑定详解(转载)

    目录 壹 ❀ 引 贰 ❀ this默认绑定 叁 ❀ this隐式绑定 1.隐式绑定 2.隐式丢失 肆 ❀ this显式绑定 伍 ❀ new绑定 陆 ❀ this绑定优先级 柒 ❀ 箭头函数的this ...

  4. js五种设计模式说明与示例

    第一种模式:js工厂模式    var lev=function(){        return "啊打";      };      function Parent(){    ...

  5. 【设计模式+原型理解】第三章:javascript五种继承父类方式

    [前言] 我们都知道,面向对象(类)的三大特征:封装.继承.多态 继承:子类继承父类的私有属性和公有方法 封装:把相同的代码写在一个函数中 多态: ->重载:JS严格意义上是没有重载,但可以通过 ...

  6. JavaScript五种继承方式详解

    本文抄袭仅供学习http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance.html 一. 构造函数绑定 ...

  7. js五种基本数据类型:string, number, boolean, null, undefined

    /** * 五种基本数据类型:string, number, boolean, null, undefined */ // undefined // 声明变量foo,未声明变量bar var foo; ...

  8. 第21篇 js四种继承方式

    js是一个很自由的语言,没有强类型的语言的那种限制,实现一个功能往往有很多做法.继承就是其中的一个,在js中继承大概可以分为四大类,上面一篇文章也提及过一些,下面开始详细说说js的继承. 1.原型继承 ...

  9. js五种设计模式

    1.js工厂模式 var lev=function(){ return "嘿哈"; }; function Parent(){ var Child = new object(); ...

随机推荐

  1. Tomcat 配置Https

    https://www.cnblogs.com/wanghaoyuhappy/p/5267702.html JDK1.8 keytool 生存证书 C:\keys\tomcat.keystore 1: ...

  2. 尚硅谷springboot学习19-日志切换

    查看相关依赖关系,排除相关依赖,引入新的日志依赖 slf4j+log4j的方式: <dependency> <groupId>org.springframework.boot& ...

  3. Redis-stat 的安装与使用

    一.ruby源码安装 下载最新版的 Ruby 压缩文件.请点击这里下载. 下载 Ruby 之后,解压到新创建的目录下: $ tar -xvzf ruby-2.2.3.tgz $ cd ruby-2.2 ...

  4. Redis进阶实践之三如何在Windows系统上安装安装Redis(转载)

    Redis进阶实践之三如何在Windows系统上安装安装Redis 一.Redis的简介 Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括 ...

  5. JAVA JDK配置

    配置环境变量_jdk 1.右键选择[计算机]——[属性] ——[左上角的高级系统设置] 2.点击[环境变量] 3.在[系统变量]里点击[新建], 变量名填写JAVA_HOME,变量值填写JDK的安装路 ...

  6. Redis Cluster 添加/删除 完整折腾步骤

    Redis还是挺好玩的,今天测试了集群的添加.删除节点.重分配slot等.更深入的理解redis的游戏规则.步骤繁多,但是详细. 环境解释: 我是在一台Centos 6.9上测试的,各个redis节点 ...

  7. UVA11572-Unique Snowflakes-(最长不同连续子序列)

    题意:给n个数,求最长不同连续子序列.n<=1e6. 解题过程: 1.记录数据存于数组 2.用左右指针l和r指向这段连续区间 3.右指针往右走,如果遇到没有存在于set集合的数就插入集合 否则左 ...

  8. ABAP表控件查询

    1.准备工作 首先SE11自建一个数据库表(数据元素,域信息请提前建好) 2.编写代码 2.1 新建一个子屏幕 子屏幕中需新定义一个文本输入框,命名为:key_word,新建一个表控件,命名为tab, ...

  9. 基于oslo_log的日志管理

    oslo_log是openstack中的日志模块,其对python logging的封装,可以快速便捷地写出我们的日志模块.官网上有许多参考示例,但实例永远是实例,其配合oslo_config模块,快 ...

  10. SVN基本页面