JS继承
所有开发者定义的类都可以作为基类,出于安全原因所有本地类,和宿主类 是不能作为基类使用的。
应为js 中所有的属性和方法都是公用的所以子类一旦继承父类就拥有了父类所有的属性和方法,而且可以为父类新增方法和属性,也可以覆盖父类的属性和方法。
因为Emcascript中没有明确的指定继承方式,所有所有的继承都是模拟而来
对象冒充:
对象冒充是开发者在在函数中频繁的使用this关键字后出现的。原理如下:
构造函数使用this给所有的属性和方法赋值,因为构造函数只是一个函数,所有可以利用ClassA 的构造函数成为ClassB的方法,实现代码如下
function ClassA(colora){ this.color=colora; this.showColor=function(){ console.log(this.color); } } function ClassB(colorb){ this.newMethod=ClassA; this.newMethod(colorb); delete this.newMethod; }
这种继承方式也可以模式多重继承,在ClassB函数内 在指向一个新的引用就可以,但是这种方式存在了一个问题就是
当多重继承的时候多个跟类有同样名字的方法或者属性,后继承的会覆盖前继承的。
解疑: 此种形式我刚开始有点不解,为什么通过这种方式B就有color 和showColor 方法我试着用这种形式的代码改造了一下
function ClassB(colorb){ this.newMethod=function(colorb){ this.color=colorb; this.showColor=function(){ console.log(this.color); } } this.newMethod(colorb); delete this.newMethod; }
我感觉这种写法更能说明ClassB 的继承实现原理
Call 方法
call()方法是与对象冒充最相似的方式,在emcascript 改进后function 新增了call() 和apply()两个方法,
在使用call 的时候第一个参数是this ,其他的参数则是直接专递给函数自身例如
function sayColor(prefix,suffix){ console.log(prefix+"__color:"+this.color+"__"+suffix);//这里this就等于call传递过来o } var o=new Object(); o.color="red"; sayColor.call(o,"sb","ub");//这个o就相当于了sayColor 中this
如果是call()的方式改造上一个继承方式如下代码
function ClassB(colorb){ ClassA.call(this,colorb); this.showName=function(){ console.log(this.colorb); } }
Apply方法
apply 有两个参数,第一个是this 要传递的对象,第二个是参数数组
function ClassB(color){ ClassA.apply(this,new Array("red")); this.showName=function(){ console.log(this.color); } }
超类传入的参数数组必须和积累顺序一致。
原型链
prototype 的对象是一个模板,要实例化的对象都是以这个模板为基础,所有prototype 对象的任何属性和方法都会传递给那个类所有的对象原型链使用这个特性实现继承的功能。
function ClassA(color){ ClassA.prototype.color=color; ClassA.prototype.showColor=function(){ console.log(this.color); } } function ClassB(color){ ClassB.prototype=new ClassA(color) } function ClassB(color){}; ClassB.prototype=new ClassA(); var b=new ClassB("red"); b.showColor(); var b=new ClassB(); b.showColor(); console.log(b instanceof ClassA);//true console.log(b instanceof ClassB);//true
使用原型链产生的超类的对象 instanceof 既是基类又是超类对象冒充则没有这个功能,原型链的缺点是不能实现多重继承。而且没法使用构造函数。
混合模式
对象冒充就必须要使用构造函数,但是使用原型链就没法使用构造函数,所以就产生了混合模式
function ClassA(color){ this.color=color; } ClassA.prototype.showColor=function(){ console.log(this.color); } function ClassB(color,name){ ClassA.call(this,color); this.name=name; } ClassB.prototype=new ClassA(); ClassB.prototype.showName(){ console.log(this.name); }
动态原型实现继承
在不采用动态原型时代码
function Polygon(side){ this.side=side; } Polygon.prototype.getArea=function(){ } function Rect(iBase,height){ Polygon.call(this,4); this.iBase=iBase; this.height=height; } Rect.prototype.getArea=function(){ return this.iBase*this.height; }
采用动态原型实现的js 继承代码
function Polygon(side){ this.side=side; if(typeof Polygon._initialized=='undefined'){ Polygon.prototype.getArea=function(){ return 0; } Polygon._initialized=true; } } function Rect(iBase,height){ Polygon.call(this,4); this.iBase=iBase; this.height=height; if(type Rect._initialized=="undefined"){ //Rect.prototype=new Polygon(); 如此定义是错误的 // 代码运行前对象已经被实例化,并与原始对象的prototype 对象 //关联起来,虽然采用后期绑定可以是原型对象的修改正确显示出来,但是替换prototype 对象不会产生任何影响,只有未来实例的对象才能反映出来,第一个对象的实例是不正确的。 Rect.prototype.getArea=function(){ return this.iBase*this.height; } Rect._initialized=true; } } Rect.prototype=new Polygon();
相关推荐
在JavaScript面向对象的上下文中,我们可以创建专门处理Canvas绘图的类,封装复杂的绘图逻辑: ```javascript class Circle { constructor(x, y, radius) { this.x = x; this.y = y; this.radius = radius; } ...
在提供的资源中,《代码之美》PDF文件可能包含了关于编程实践和代码风格的指导,而《Javascript面向对象编程》PPT可能更具体地阐述了JavaScript OOP的细节和示例。学习这些材料将有助于深入理解JavaScript的面向对象...
以上六种继承方式在JavaScript面向对象编程中各有用途,开发者可以根据具体需求选择最适合的继承方式。需要注意的是,虽然继承可以使代码复用性更高,但过度的继承层次和复杂的继承关系可能会导致代码难以理解与维护...
### 面向对象JavaScript精要 #### 一、书籍概览 本书《面向对象JavaScript...通过学习本书,读者可以全面掌握面向对象编程的基本概念,并学会如何将这些概念应用到JavaScript中,从而编写出更加健壮、可维护的代码。
在本文中,我们将介绍JavaScript面向对象编程中的经典案例,包括对象、类、继承、原型链和闭包等概念。 一、对象和类 在JavaScript中,对象是指一个实体,可以拥有自己的属性和方法。对象可以使用工厂函数或构造...
《JavaScript面向对象编程指南》内容包括:JavaScript作为一门浏览器语言的核心思想;面向对象编程的基础知识及其在JavaScript中的运用;数据类型、操作符以及流程控制语句;函数、闭包、对象和原型等概念,以代码...
JavaScript作为一门浏览器语言的核心思想;面向对象编程的基础知识及其在... 《JavaScript面向对象编程指南》着重介绍JavaScript在面向对象方面的特性,展示如何构建强健的、可维护的、功能强大的应用程序及程序库
本文将深入探讨JavaScript中的面向对象继承,这是理解JavaScript OOP的关键部分。 面向对象继承是实现代码复用和模块化的重要机制。在JavaScript中,继承主要通过原型链(Prototype Chain)实现。每个JavaScript...
JavaScript是一种广泛...通过深入学习这本《JavaScript面向对象编程指南(第2版)》,开发者不仅能掌握JavaScript的面向对象编程基础,还能了解到实际项目中如何有效地运用这些知识,提升编程技巧和解决问题的能力。
本文介绍了JavaScript面向对象编程的基本概念和技术细节,包括变量和对象的基础用法、函数的作用以及如何通过封装和继承来构建复杂的对象层次结构。JavaScript的独特之处在于它的灵活性和动态性,这使得它成为了一种...
JavaScript面向对象编程--继承.mht,JavaScript面向对象编程--继承.mht,JavaScript面向对象编程--继承.mht,JavaScript面向对象编程--继承.mht
### JavaScript面向对象进阶知识点详解 #### 8.1 面向对象编程的基本特性 在探讨面向对象的JavaScript之前,我们首先需要了解面向对象编程(Object-Oriented Programming, OOP)的基本特性:封装性、抽象性、继承...
"javascript面向对象框架"这一主题涵盖了JavaScript中实现面向对象编程的框架,特别是Prototype和MooTools这两个优秀的库。 Prototype是JavaScript的一个开源库,它扩展了JavaScript的基本对象和函数,提供了强大的...
总结来说,"js 贪吃蛇(面向对象)"案例提供了学习和实践JavaScript面向对象编程的好机会。通过分析和实现这个案例,开发者可以深入理解面向对象的设计原则,提高代码复用和维护性,同时也能体会到面向对象编程在...
总结一下,JavaScript面向对象编程主要包括类的表示(通过构造函数)、对象的创建(对象工厂、构造函数、原型模式)以及继承的实现(原型链)。理解这些概念对于深入学习JavaScript和开发复杂的JavaScript应用至关...
JavaScript,作为一种广泛应用...JavaScript 面向对象程序设计——继承与多态.pdf 和 JavaScript 面向对象程序设计——封装.pdf 这两个文档可能深入探讨了这些主题,帮助读者深入理解并掌握JavaScript的面向对象开发。
在JavaScript中,面向对象编程主要体现在三个方面:构造函数、原型和原型链以及闭包。以下是对这些概念的详细解释: 1. **构造函数**: 在JavaScript中,构造函数是一种特殊类型的函数,用于初始化一个新创建的...