许多OO 语言都支持两种继承方式:接口继承和实现继承。接口继承只继承方法签名,而实现继承则继承实际的方法。如前所述,由于函数没有签名,在ECMAScript 中无法实现接口继承。ECMAScript 只支持实现继承,而且其实现继承主要是依靠原型链来实现的。在此,主要阐述一下,原型链继承,借用构造函数、组合继承、原型式继承、寄生式继承、寄生组合继承等。1.原型链ECMAScript 中描述了原型链的概念,并将原型链作为实现继承的主要方法...
在正式讨论js继承之前,先说说自己的工作体会。不像后端,对于大多数商业应用场景,对前端的要求往往会导致代码难以上溯(指难以抽象,难以写一遍代码在好几个场景都适用)。说个我熟悉的应用场景:比如一个信用评级模块,一个页面用一个折线图显示用户最近的消费水平,另一个页面用一个折线图展示用户的信用评级水平。看似很相似的需求吧?拿到java里肯定抽象出一个“折线图接口“了吧,但是在js里就很难统一。首先,这两个数据来...
下面小编就为大家带来一篇js的OOP继承实现(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧这里Student.prototype之所以使用create方法来创建,而不是直接赋Person.prototype的值,是因为如果使用赋值的话,两个就指向同一个对象,如果我们想要在student类上添加新的方法,就不行。所以要是哟呵那个create方法来让Person.prototype作为Student.prototype的原型如果我们修改bosn的原型上的...
继承的本质:重用在探讨 javaScript 的原型继承之前,先不妨想想为什么要继承?考虑一个场景,如果我们有两个对象,它们一部分属性相同,另一部属性不同。通常一个好的设计方案是将相同逻辑抽出来,实现重用。以 xiaoMing liLei 两位同学举例。这两位同学有自己的名字,并且会介绍自己。抽象为程序对象,可以做如下表示。var xiaoMing = {name : "xiaoMing",hello : function(){console.log( Hello, my name is + this.name + .);}...
JavaScript语言本身没有提供类,没有其它语言的类继承机制,它的继承是通过对象的原型实现的,但这不能满足Cocos2d-JS引擎的要求。由于Cocos2d-JS引擎是从Cocos2d-x演变而来的,在Cocos2d-JS的早期版本Cocos2d-HTML中几乎全部的API都是模拟Cocos2d-x API而设计的,Cocos2d-x本身是有C++编写的,其中的很多对象和函数比较复杂,JavaScript语言描述起来有些力不从心了。在开源社区中John Resiq在他的博客(http://ejohn.org/blog/sim...
面向对象的特征之一就是继承。大多数面向对象的编程语言都支持两种继承方式:接口继承和实现继承。接口继承只继承方法签名,而实现继承则继承实际的方法。由于在JavaScript中函数没有签名,所以无法实现接口继承。在JavaScript中主要是通过原型链来实现继承。 基于原型链实现继承基于原型链实现继承的基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。在前面我们已经介绍了原型,构造函数和对象实例之间的关系,并...
由于基于原型链实现继承的方式存在一些缺点,所以人们采用了另外一种方式来实现继承——基于函数伪造的方式实现继承。这个技术的思想是在子类构造函数的内部调用父类的构造函数。 基于函数伪造的方式实现继承的实现方式因为在JavaScript中,函数是在特定环境中执行代码的对象,所以我们可以使用call()或apply()方法来在子类对象上执行父类对象的构造函数。来看下面的例子:/* 创建父类 */ function Parent(){this.color = ["red","...
上文提到我们不会单独使用基于函数伪造的方式实现继承,而是会使用基于原型链和函数伪装组合的方式实现继承。这种继承方式也叫伪经典继承,它的思想是使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承。这样,既通过在原型上定义方法实现了函数的复用,又能够保证每个实例都有它自己的属性。来看下面的例子,我们先列出基于原型链和函数伪装组合的方式实现继承完整的代码,然后再对代码中的每一步...
整理一下js面向对象中的封装和继承。1.封装 js中封装有很多种实现方式,这里列出常用的几种。1.1 原始模式生成对象 直接将我们的成员写入对象中,用函数返回。 缺点:很难看出是一个模式出来的实例。代码: function Stu(name, score) {return {name: name,score: score}}var stu1 = Stu("张三", 80);var stu2 = Stu("李四", 90);console.log(stu1.name); // 张三1.2 生成构造模式对象 js帮我们提供了一个使用构造函...
对象创建:当一个函数对象被创建时候,Function构造器产生的函数对象会运行类似这样的代码:this.prototype={constructor:this};假设函数FF用new方式构造对象时,对象的constructor被设置成这个F.prototype.constructor如果函数在创建对象前修改了函数的prototype,会影响创建出来对象的construtor属性如:function F(){};F.prototype={constructor:1111};var o=new F();//o.constructor===‘1111’ true继承原理:JavaScript中的继...
JavaScript的出现已经将近20多年了,但是对这个预言的褒贬还是众说纷纭。很多人都说JavaScript不能算是面向对象的变成语言。但是JavaScript的类型非常松散,也没有编译器。这样一来给了程序员很大的自由,也带来了一些缺陷。 虽然JavaScript不算是一门面向对象的语言。但是我们可以模仿着其他语言实现面向对象的方式来实现JavaScript的面向编程。 下面是JavaScript教程中非常经典的继承方法。//定义一个Pet对象。通过这一个名...
虽然 JavaScript 天生就是一副随随便便的样子,但是随着浏览器能够完成的事情越来越多,这门语言也也越来越经常地摆出正襟危坐的架势。在复杂的逻辑下, JavaScript 需要被模块化,模块需要封装起来,只留下供外界调用的接口。闭包是 JavaScript 中实现模块封装的关键,也是很多初学者难以理解的要点。最初,我也陷入迷惑之中。现在,我自信对这个概念已经有了比较深入的理解。为了便于理解,文中试图封装一个比较简单的对象。我们...
1. 前言有人认为JavaScript 是一门面向过程的语言。 因为基本的使用基本上都是写函数,然后调用。 ==> 这种想法是不对的。JS的创立者是: Brendan Eich. 在JS创立的时候, Java 以及面向对象的设计已经大行其道了。1995年5月,Netscape做出决策,未来的网页脚本语言必须"看上去与Java足够相似",但是比Java简单,使得非专业的网页作者也能很快上手。基于此, 订立的设计思想是: (1)借鉴C语言的基本语法; (2)借鉴Java语...
一、函数创建过程在了解原型链之前我们先来看看一个函数在创建过程中做了哪些事情,举一个空函数的例子:1 function A() {};当我们在代码里面声明这么一个空函数,js解析的本质是(肤浅理解有待深入):1、创建一个对象(有constructor属性及[[Prototype]]属性),根据ECMA,其中[[Prototype]]属性不可见、不可枚举2、创建一个函数(有name、prototype属性),再通过prototype属性 引用 刚才创建的对象3、创建变量A,同时把函数的 ...
对象冒充的方法实现:[javascript]function Human() { <span style="white-space:pre"> </span>//定义Human类 this.species = "Human"; } function Sex(sex) { <span style="white-space:pre"> </span>//定义Sex类 this.sex = sex; } function Chinese(name,sex) { this.name = name; this.newMethod1 = Human; //对象冒充,指向Human对象 this.newMethod1(); //调用方法,实现继承 delet...