Javascript无参数和有参数类继承问题解决方法
说到Javascript的类继承,就必然离不开原型链,但只通过原型链实现的继承有着不少缺陷。
无参数类继承的问题
先看一段示例代码,实现B继承于A:
function A() {
}
A.prototype.a1 = function() { };
function B() {
}
B.prototype = new A();
B.prototype.b1 = function() { };
var b = new B();
alert(b.constructor == A); // true
alert(b.constructor == B); // false
这段代码的主要问题是:
1.需要实例化A作为B的原型,此时就执行了A的构造函数。但按照面向对象的规则,实例化B之前,B及其父类A的构造函数都不应该执行。
2.更改了B的prototype,导致b.constructor不是B而是A。
有参类继承的问题
假设A和B都有两个字符串参数s1和s2,A中计算了两段字符串的总长度,B直接以s1、s2为参数调用A:
function A(s1, s2) {
this.totalLength = s1.length + s2.length;
}
A.prototype.a1 = function() {
};
function B(s1, s2) {
}
B.prototype = new A();
B.prototype.b1 = function() {
};
new B("ab", "123");
可以看到,这段代码中根本没有办法把s1和s2传到A,而又因为实例化A作为B的原型时没有参数,所以出现了异常:
s1 is undefined
解决方案
s1和s2的作用域只在B内,要把它们传到A,就只能在B中操作,借助函数的apply方法就可以实现之:
function B(s1, s2) {
A.apply(this, arguments);
alert(this.totalLength);
}
接下来的问题就是如何把A的方法添加到B的原型中去。这也不难,只要遍历A.prototype,把方法复制到B.prototype即可。要注意的是,对于同名的方法,自然是子类优先(重载),因而不能覆盖:
for (var m in A.prototype) {
if (!B.prototype[m]) { // 父类不能覆盖子类的方法
B.prototype[m] = A.prototype[m];
}
}
后记
考虑到C#、Java等高级语言都抛弃了多继承,因此,本文所讨论的也只是单继承的情况。而本文所述的继承方法,也会写成jRaiser的一个扩展,迟些发布。
相关推荐
-
JavaScript中的继承之类继承
继承简介 在JS中继承是一个非常复杂的话题,比其他任何面向对象语言中的继承都复杂得多.在大多数其他面向对象语言中,继承一个类只需使用一个关键字即可.在JS中想要达到继承公用成员的目的,需要采取一系列措施.JS属于原型式继承,得益于这种灵活性,我们既可以使用标准的基于类的继承,也可以使用更微妙一些的原型式继承.在JS中应该要明确一点,一切继承都是通过prototype来进行的,且JS是基于对象来继承的. 继承: function Animal(name){ this.name = name; th
-
js模拟类继承小例子
复制代码 代码如下: //使用原型继承,中间使用临时对象作为Child的原型属性,临时对象的原型属性再指向父类的原型, //防止所有子类和父类原型属性都指向通一个对象. //这样当修改子类的原型属性,就不会影响其他子类和父类 function extend(Child, Parent) { var F = function(){}; F.prototype = Parent.prototype; Child.prototype = new F(); Child.prototype.constru
-
再论Javascript的类继承
无参数类继承的问题 先看一段示例代码,实现B继承于A: 复制代码 代码如下: function A() { } A.prototype.a1 = function() { }; function B() { } B.prototype = new A(); B.prototype.b1 = function() { }; var b = new B(); alert(b.constructor == A); // true alert(b.constructor == B); // false
-
JavaScript中的类继承
JavaScript Inheritance DouglasCrockfordwww.crockford.com And you think you're so clever and classless and free--John Lennon JavaScript一种没有类的,面向对象的语言,它使用原型继承来代替类继承.这个可能对受过传统的面向对象语言(如C++和Java)训练的程序员来说有点迷惑.JavaScript的原型继承比类继承有更强大的表现力,现在就让我们来看看. Java Jav
-
JavaScript类继承及实例化的方法
本文实例讲述了JavaScript类继承及实例化的方法.分享给大家供大家参考.具体如下: (function(){ var Class = { //扩展类 create: function(aBaseClass, aClassDefine){ var $class = function(){ for(var member in aClassDefine){ this[member] = aClassDefine[member]; } if('undefined'===typeof aClassD
-
再谈javascript原型继承
真正意义上来说Javascript并不是一门面向对象的语言,没有提供传统的继承方式,但是它提供了一种原型继承的方式,利用自身提供的原型属性来实现继承. 原型与原型链 说原型继承之前还是要先说说原型和原型链,毕竟这是实现原型继承的基础. 在Javascript中,每个函数都有一个原型属性prototype指向自身的原型,而由这个函数创建的对象也有一个__proto__属性指向这个原型,而函数的原型是一个对象,所以这个对象也会有一个__proto__指向自己的原型,这样逐层深入直到Object对象的
-
javascript类继承机制的原理分析
目前 javascript的实现继承方式并不是通过"extend"关键字来实现的,而是通过 constructor function和prototype属性来实现继承.首先我们创建一个animal 类 js 代码 复制代码 代码如下: var animal = function (){ //这就是constructor function 了 this .name = 'pipi'; this .age = 10; this .height = 0; } //建立一个动物的实例 var
-
Javascript无参数和有参数类继承问题解决方法
说到Javascript的类继承,就必然离不开原型链,但只通过原型链实现的继承有着不少缺陷. 无参数类继承的问题 先看一段示例代码,实现B继承于A: 复制代码 代码如下: function A() { } A.prototype.a1 = function() { }; function B() { } B.prototype = new A(); B.prototype.b1 = function() { }; var b = new B(); alert(b.constructor == A
-
JavaScript无操作后屏保功能的实现方法
今天组里的同事要写一个屏保的效果,要求鼠标无操作N秒后进入屏幕保护,滑动鼠标的时候取消屏幕保护.因为是坐在网页上,所以用JavaScript简单实现了一下,记录在此,代码如下: <html> <head> <title>屏幕保护测试</title> <script type="text/javascript"> var message ;//获取p标签 var t=setTimeout("delayTask()&qu
-
详解C++基础——类继承中方法重载
一.前言 在上一篇C++基础博文中讨论了C++最基本的代码重用特性--类继承,派生类可以在继承基类元素的同时,添加新的成员和方法.但是没有考虑一种情况:派生类继承下来的方法的实现细节并不一定适合派生类的需求,此时派生类需要重载集成方法. 二.重载方法及虚函数 我们讨论<C++ Primer Plus>中的如下场景:银行记录客户信息,包括客户姓名.当前余额.客户这一类别当然能够创建客户对象.存款.取款以及显示信息.银行需要特殊记录具有透支权限的客户,因此这一类别的客户要额外记录透支上限.透支贷款
-
javascript在子页面中函数无法调试问题解决方法
近期在做一个项目,会遇到在子页面中提交的时候会无法能够调试javascript代码的情况出现,有时候这种问题,我们无法正常在浏览器,看到我们子页面的javascript代码,所以只能够用原始的alert 或者 console.log(),当然,这也是一种解决方法,但是有时候,我们就想看一下程序到底是如何运行的,同时也可以看每个参数到底是什么值,所以意义还是比较大的. 我贴张图,大家就大概了解是什么时候会出现这个问题了. 复制代码 代码如下: <script> function stopWatc
-
javascript 动态数据下的锚点错位问题解决方法
复制代码 代码如下: <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>用 Javascript 实现锚点(Anchor)间平滑跳转</title> <script language="javascript"> // 说明 :用 Javascript 实现锚点(Anchor)间平滑跳转 //
-
python实现诗歌游戏(类继承)
本文实例为大家分享了python实现诗歌游戏的具体代码,供大家参考,具体内容如下 具体游戏有:根据上句猜下句.猜作者.猜朝代.猜诗名等 如果有更好玩儿的游戏,不妨自己写一下 1.首先,先把搜集到的诗歌全部放到一个txt文件下,命名为poems.txt 2.其次,再定义一个poem类,执行的时候输出诗歌的名字,作者,朝代等,代码如下: class Poem: def __init__(self): self.title = '' self.dynasty = '' self.author = ''
-
ES6 javascript中Class类继承用法实例详解
本文实例讲述了ES6 javascript中Class类继承用法.分享给大家供大家参考,具体如下: 1. 基本用法 Class 之间可以通过extends关键字实现继承, 这比 ES5 的通过修改原型链实现继承, 要清晰和方便很多. class ColorPoint extends Point {} 上面代码定义了一个ColorPoint类, 该类通过extends关键字, 继承了Point类的所有属性和方法. 但是由于没有部署任何代码, 所以这两个类完全一样, 等于复制了一个Point类. 下
-
使用JavaScript获取URL中的参数(两种方法)
本文给大家分享两种方法使用js获取url中的参数,其中方法二是使用的正则表达式方法,大家可以根据需要选择比较好的方法,废话不多说了,直接看详细介绍吧. 方法一: //取url参数 var type = request("type") function request() { var query = location.search; var paras = arguments[0]; if (arguments.length == 2) { query = arguments[1]; }
随机推荐
- 正则表达式搭配js轻松处理json文本方便而老古
- Redis教程(十四):内存优化介绍
- linux下如何配置SQLSERVER ODBC
- 在IIS上重新注册.NET Framework 2.0的命令和参数详解
- Global.asax的Application_BeginRequest实现url重写无后缀的代码
- UTF-8编码第1/2页
- 解析android中include标签的使用
- php 在windows下配置虚拟目录的方法介绍
- 纯JS单页面赛车游戏制作代码分享
- php中将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串
- 解决Jquery load()加载GB2312页面时出现乱码的两种方案
- PHP curl 并发最佳实践代码分享
- SpringMVC中使用bean来接收form表单提交的参数时的注意点
- C# 设计模式系列教程-单例模式
- ora-00119和ora-00132问题的解决方法
- jQuery.buildFragment使用方法及思路分析
- Android开发中类加载器DexClassLoader的简单使用讲解
- 不能在子类或外部类发布C#事件代码分析
- strcat函数实现简单示例
- AsyncTask类实例详解