//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. AIR程序调用本地默认应用程序打开本地文件

    当我用下面语句的时候,可以成功打开桌面文件夹下面的文件: var file:File = File.desktopDirectory.resolvePath("test.jpg") ...

  2. 01_hello world

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 【Noip模拟 20161004】局域网

    问题描述 所有SZSZ 学生翘首以盼的新教学楼总算快要竣工了,接下来到了网络布线的时候.网络系统的总布局是由nn台计算机组成的有线局域网,每根网线长度为dd,正常情况下,网线是可以缠绕使其变短但是不能 ...

  4. Erlang Error Records

    1.No match of right hand value ... Erlang变量名需要以大写开头.

  5. js 迭代器 解说

    这里要说的是迭代器,是一种思路而已,代码相对来不是最关键的,个人认为,最关键的部分是实现的思路 要求: 在一个网页中,将所有的 p 元素的内容进行替换,但是在特定的位置的 p 元素是要有差异的进行替换 ...

  6. sql server 2008 数据库可疑的解决步骤

    备份并新建同名数据库,并替换原数据文件 1 把问题数据库备份后直接删除 停掉SQLSERVER服务,把服务器上出问题的数据库, 假设名称为 test的数据库文件及日志文件备份到其他目录,然后直接将其删 ...

  7. 2.ECS内 经典网络与VPC网络的区别

    对应阿里云学习视频地址:https://help.aliyun.com/video_detail/67686.html?spm=5176.208355.1107604.1.10d82ca1J91Ckt ...

  8. linux 内核假死循环导致的问题

    [, comm: -IFileSender Tainted: G B ENX -- ZTE Grantley/S1008 [:[<ffffffff810fb2cb>] [<fffff ...

  9. openvas开放式漏洞评估系统

    OpenVAS是开放式漏洞评估系统,也可以说它是一个包含着相关工具的网络扫描器.其核心部件是一个服务器,包括一套网络漏洞测试程序,可以检测远程系统和应用程序中的安全问题. 用户需要一种自动测试的方法, ...

  10. C# Excel导数据

    遇到的几个坑,记录一下. 隐藏表,隐藏行,隐藏列, 单元格合并 => 拆分并填充内容, 显示隐藏列,结果那个列 还是不显示出来,拖动旁边的列也不显示. 结果在旁边的列上,按左右箭头键就出来了,也 ...