继承方式有四种:

1、call

2、apply

3、prototype

4、for in

call 和 apply 的主要区别:

call 传参数只能一个一个的传,

apply 因为是用数组,所以可以用arguments 获取所有的实参。当参数多时,就用apply更方便。

arguments = 返回参数集合

call 和 apply 继承

已打飞机游戏为例:

创建飞机时有很多重复的步骤

以创建玩家飞机 用call 继承 和用applay 创建boss飞机为例:

/*父模板*/
/*x,y,节点,blood,speed
* move
* shoot XXX
* init
* */
   /*通用的父模板*/
function Plane(x,y){
console.log("plane构造函数")
console.log(this);
this.x = x;
this.y = y;
this.imgNode = document.createElement("img")
this.imgsrc="";
this.blood=5;
this.speed=10;
this.move=function(){
console.log("Plane的move方法");
}
this.init=function(){}
this.init();
}
/*1.call*/
function PlayerPlane(px,py){
console.log(this); //new PlayerPlane()
// call传递参数,参数依次写上
Plane.call(this,px,py); //写在代码第一行
// 重写 ==》多态 同一个方法,不同的实现方式
this.x=1000;
this.move=function(){
console.log("Player Plane 的move方法")
}
this.shoot=function(){}
} var playerplane = new PlayerPlane(200,300);
console.log(playerplane.hasOwnProperty("x")); //true
console.log(playerplane.x)
playerplane.move();
 /*2.apply*/

    function BossPlane(bx,by){
console.log(arguments); //参数数组
Plane.apply(this,arguments);
this.move=function(){
console.log("Boss飞机的移动");
}
} var bossplane = new BossPlane(100,200);
console.log(bossplane.x,bossplane.y);
bossplane.move()

原型继承

    /*通用的手机模板*/
function Phone(name,price){
this.phoneName = name;
this.price = price;
this.color="red";
this.callPhone=function(){ }
} function IPhone(){
this.color="blue";
this.music=function(){
console.log("听音乐");
}
this.news=function(){
console.log("看新闻");
}
} var iphone1 = new IPhone();
console.log(iphone1.color); //原型链继承
IPhone.prototype = new Phone("苹果",6000);
var iphone2 = new IPhone();
console.log(iphone2.color); console.log(iphone1.__proto__); //原本的Iphone.prototype, 空对象
console.log(iphone2.__proto__); //new Phone()
console.log(iphone1.__proto__===iphone2.__proto__); //false IPhone.prototype.newfunc=function(){
console.log("新添加的功能");
}
iphone1.__proto__.newfunc2=function(){
console.log("另外一个新添加的功能");
}
// iphone1.newfunc2();
// iphone2.newfunc();
console.log("color" in iphone2); //true
console.log(iphone2.hasOwnProperty("color")); //false
区别与前两种方法:

通过原型链继承的属性不是自己的,

只是存在于原型链上。
 
 Phone.country="中国";
// var p = new Phone();
// console.log(p.country) //undefined 原型链上并没有
// console.log("country" in p) //false
/*p = 实例化对象
* Phone = 函数 --- 函数也是一个对象*/
// console.log(Phone.country); //只有Phone函数才能调用country // var iphone1 = new IPhone();
// console.log(iphone1.country); IPhone.prototype = new Phone();
var iphone2 = new IPhone();
console.log(iphone2.country); //undefined
console.log(iphone2.color); IPhone.prototype = Phone;
var iphone3 = new IPhone();
console.log(iphone3.country); // 打印得出来了
console.log(iphone3.color); // undefined
console.log(iphone3.__proto__.__proto__.__proto__) //prototype 指向一个对象就行了,可以是自己创建的新对象。
IPhone.prototype={
newAttr1:"新属性1",
newAttr2:"新属性2"
}
var iphone4 = new IPhone();
console.log(iphone4.newAttr1);
 

js 面向对象 继承的更多相关文章

  1. js面向对象继承

    前言 最近看到js面向对象这章节了,主要学习了原型和面向对象继承关系,为了梳理自己的知识逻辑,特此记录. js的面向对象 先说说我目前了解的js创建对象方法 1.写一个函数,然后通过new创建对象 2 ...

  2. js面向对象 继承

    1.类的声明 2.生成实例 3.如何实现继承 4.继承的几种方式 1.类的声明有哪些方式 <script type="text/javascript"> //类的声明 ...

  3. 关于JS面向对象继承问题

    1.原型继承(是JS中很常用的一种继承方式) 子类children想要继承父类father中的所有的属性和方法(私有+公有),只需要让children.prototype=new father;即可. ...

  4. JS 面向对象 ~ 继承的7种方式

    前言: 继承 是 OO 语言中的一个最为人津津乐道的概念.许多 OO 语言都支持两种继承方式:接口继承 和 实现继承.接口继承只继承方法签名,而实现继承则继承实际的方法.如前所述,由于函数没有签名,在 ...

  5. js 面向对象 继承机制

    根据w3cschool上的描述:共有3种继承方法(对象冒充,原型链,混合) 1.对象冒充:构造函数ClassA使用this关键字给所有属性和方法赋值,使ClassA构造函数成为ClassB的方法,调用 ...

  6. JS面向对象(3) -- Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法

    相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...

  7. JS面向对象(2) -- this的使用,对象之间的赋值,for...in语句,delete使用,成员方法,json对象的使用,prototype的使用,原型继承与原型链

    相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...

  8. js面向对象之继承那点事儿根本就不是事

    继承 说道这个继承,了解object-oriented的朋友都知道,大多oo语言都有两种,一种是接口继承(只继承方法签名):一种是实现继承(继承实际的方法) 奈何js中没有签名,因而只有实现继承,而且 ...

  9. 捋一捋js面向对象的继承问题

    说到面向对象这个破玩意,曾经一度我都处于很懵逼的状态,那么面向对象究竟是什么呢?其实说白了,所谓面向对象,就是基于类这个概念,来实现封装.继承和多态的一种编程思想罢了.今天我们就来说一下这其中继承的问 ...

随机推荐

  1. vijos 1942 [AH 2005] 小岛

    描述 西伯利亚北部的寒地,坐落着由 N 个小岛组成的岛屿群,我们把这些小岛依次编号为 1 到 N . 起初,岛屿之间没有任何的航线.后来随着交通的发展,逐渐出现了一些连通两座小岛的航线.例如增加一条在 ...

  2. 水dp第二天(背包有关)

    水dp第二天(背包有关) 标签: dp poj_3624 题意:裸的01背包 注意:这种题要注意两个问题,一个是要看清楚数组要开的范围大小,然后考虑需要空间优化吗,还有事用int还是long long ...

  3. HDU--2024

    C语言合法标识符 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  4. 自实现PC端jQuery版轮播图

    最近其他项目不是很忙,被安排给公司的官网项目做一个新的页面(之前没接触公司官网项目),其中有一个用到轮播图的地方,最开始想直接用swiper.js插件实现就好了,可是发现官网项目里之前都没有引入过sw ...

  5. Linux包管理器

    按Linux系统分类 Redhat系列:Redhat(本身就是Centos).Centos.Fedora等,采用Dpkg包管理器 Debian系列:Debian.Ubuntu等,使用RPM包管理器 R ...

  6. dig命令

      dig(域信息搜索器)命令是一个用于询问 DNS 域名服务器的灵活的工具.它执行 DNS 搜索,显示从受请求的域名服务器返回的答复.多数 DNS 管理员利用 dig 作为 DNS 问题的故障诊断, ...

  7. phpMyAdmin访问远程MySQL数据库的方法

    本地phpmyadmin远程连接服务器端MySQL 首先要确定你的mysql远程连接已开启,如果没有开启按照下面的二个方法操作: 方法一:改表法 因为在linux环境下,默认是关闭3306端口远程连接 ...

  8. 如何开发由Create-React-App 引导的应用(四)

    此文章是翻译How to develop apps bootstrapped with Create React App 官方文档 系列文章 如何开发由Create-React-App 引导的应用 如 ...

  9. 经典CSS坑:如何完美实现垂直水平居中?

    经典CSS坑:如何完美实现垂直水平居中? 踩了各种坑之后总结出的方法,开门见山,直接上代码和效果图.希望对读者有所帮助,后续如果有更好的方法,我也会持续更新 第一种方法:transform(个人认为最 ...

  10. HierarchyID 数据类型用法

    树形层次结构(Hierarchy)经常出现在有结构的数据中,T-SQL新增数据类型HierarchyID, 其长度可变,用于存储层次结构中的路径.HierarchyID表示的层次结构是树形的,由应用程 ...