//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. day12-集合

    集合 1.什么是集合 set(集合)是一个无序不重复元素的数据集,与列表的区别1.无序的,不可以使用索引进行顺序的访问2.不能够有重复的数据. 项目开发中,集合主要用在数据元素的去重和测试是否存在.集 ...

  2. C#与.NET概述

    .NET Framework是一个支持生成和运行下一代应用程序和web服务的集成在Windows中的组件. 关键组建为CLR和FCL. 为其运行的应用程序提供各种服务的托管执行环境,简化的开发和部署以 ...

  3. Delphi访问网页中的下拉菜单

    Delphi通过TWebBrowser浏览网页,然后访问该网页中的下拉菜单: uses MsHtml;procedure TForm1.Button1Click(Sender: TObject);va ...

  4. [CI]CodeIgniter视图 & 模型 & 控制器

    ---------------------------------------------------------------------------------------------------- ...

  5. web前端基础知识!

    [HTML文档的基本结构和语法][基本结构]: <HTML> HTML 文件开始 <HEAD> HTML 文件的头部开始 <title> 网页的标题</tit ...

  6. FMS Dev Guide学习笔记(SharedBall)

    一.开发交互式的媒体应用程序1.共享对象(Shared objects) ----SharedBall example 这个SharedBall example创建了一个临时的远程共享对象.类似于多人 ...

  7. unity3d API知识点随记

    1.transform.translate是增加transform面板相应的数值x,y,z是以本地坐标系为方向:transform.transformdirection是以世界坐标系为方向,可以去测试 ...

  8. 使用javap进行反编译Java枚举

    这是一个枚举类Day.java public enum Day { MONDAY("星期一"), TUESDAY("星期二"), WEDNESDAY(" ...

  9. BOS物流项目第十三天

    教学计划 1.Quartz概述 a. Quartz介绍和下载 b. 入门案例 c. Quartz执行流程 d. cron表达式 2.在BOS项目中使用Quartz创建定时任务 3.在BOS项目中使用J ...

  10. maven(二)基于intellij idea搭建maven项目

    搭建步骤: 1.File -> New Module,进入创建项目窗口. 接着下一步,这里需要注在Properties中添加一个参数 archetypeCatalog=internal,不加这个 ...