关于js里利用call继承的一点疑惑,头疼!

问题描述

我在网上看到call的用法时,他这样写道: “应用call和apply更有一个技巧在里面,就是用call和apply应用另一个函数(类)以后,当前的函数(类)就具有了另一个函数(类)的方法或是属性,这也能称之为“继承”。” 于是我用下面的这段代码做了实验:得出了下面结论:1、确实能够起到继承的作用。2、给原型里添加的属性和方法为什么继承不到? 第二点我百思不得其解,希望哪位高高手帮我解答下。以下便是我实验代码:<script type="text/javascript"> function Base(){ this.name = "base";this.age = 25;this.sayName = function(){alert(this.name);}; } Base.prototype.sayAge = function(){alert(this.age)}; function Extend(){ //继承 Base.call(this);//覆盖this.name = "extend"; } var e = new Extend(); var b = new Base(); e.sayName(); //正常。“extend” //e.sayAge(); //会报错。 b.sayAge(); //正常。 b.sayName(); //正常。</script>问题补充 昨天晚上回去看了下《JavaScript高级程序设计(第2版)》,正巧是你推荐的那本。自认为弄懂了个大概,今日看兄台所写,觉得我有必要再看一次。 因为我昨天也看到了“组合继承模式”就是“原型继承模式”和“构造函数继承模式”的组合(不知对否?),却没联想到这上面来。

解决方案

具体解释看我加的代码注释:<script type="text/javascript"> function Base(){ this.name = "base";this.age = 25;this.sayName = function(){alert(this.name);}; } Base.prototype.sayAge = function(){alert(this.age)}; function Extend(){ /* 此处是将Base()当成一个普通的函数来调用,而不是把它当做父类的构造函数; Base.call(this);实际是将Extend的作用域指定给Base()函数,也就是给Extend动态添加了两个成员变量(属性),name和age; 而并没有进行任何关于原型方面的操作,没有构成原型链。 这种继承方法叫做“借用构造函数”。 */ Base.call(this);this.name = "extend"; } // (1) // Extend.prototype = new Base(); var e = new Extend(); var b = new Base(); e.sayName(); //正常。“extend” /* 由于没有来自于Base()的原型继承,自然找不到原型中定义的sayAge。如果想要同样实现原型的继承,需要在var e = new Extend();之前将Extend()的原型指定为Base()类型的实例,即在(1)处加上:Extend.prototype = new Base();这就构成了原型链,与“借用构造函数”共同构成了“组合继承”,也称为“伪经典继承”。*/ //e.sayAge(); b.sayAge(); b.sayName();</script>伪经典继承,也不是最完美的继承方式,更理想的是使用“寄生组合式继承”。具体的内容推荐阅读《JavaScript高级程序设计(第2版)》。

时间: 2024-08-31 11:11:15

关于js里利用call继承的一点疑惑,头疼!的相关文章

浅谈js原型链与继承

js原型链与继承是js中的重点,所以我们通过以下三个例子来进行详细的讲解.       首先定义一个对象obj,该对象的原型为obj._proto_,我们可以用ES5中的getPrototypeOf这一方法来查询obj的原型,我们通 过判断obj的原型是否与Object.prototype相等来证明是否存在obj的原型,答案返回true,所以存在.然后我们定义一个函数 foo(),任何一个函数都有它的prototype对象,即函数的原型,我们可以在函数的原型上添加任意属性,之后通过new一个实例

关于java继承的一点思考

关于继承的一点思考 在 java 中, 继承是实现复用的一种方法,虽然很多时候不建议使用继承, 但不可否认,有时候使继承,更容易理解某个设计 我碰到过这样一种情况,一般的操作对象 类 A 实例,但是会间或操作一些类 B 的实例,B 大部的属性 A 都包括,这个时候使用继承,应该没什么问题的(至少我现在的理解是没什么问题,各位多指教),现在把A 和 B的一些实例放到 一个数组中 A[] as 中 ,现在要轮循 as ,并对 B进行一些操作,这个时候,可以用 instanceof 判断是不是 B ,

asp.net里利用ajax和jquery将前台的值,传给后台查询数据库,再将查询结果返到前台。

问题描述 asp.net里利用ajax和jquery将前台的值,传给后台查询数据库,再将查询结果返到前台. 例如:在前台获取了一个值 "D11" 如何将D11传给后台.ashx文件里通过语句select * from table where ID="D11"; 再将给过返回给前台. 这个语句怎么写啊. 怎样将D11传递到后台去啊! 解决方案 1.无参数的方法调用, 注意:1.方法一定要静态方法,而且要有[WebMethod]的声明 后台: using System.

js原型链与继承解析(初体验)_javascript技巧

首先定义一个对象obj,该对象的原型为obj._proto_,我们可以用ES5中的getPrototypeOf这一方法来查询obj的原型,我们通过判断obj的原型是否与Object.prototype相等来证明是否存在obj的原型,答案返回true,所以存在.然后我们定义一个函数foo(),任何一个函数都有它的prototype对象,即函数的原型,我们可以在函数的原型上添加任意属性,之后通过new一个实例化的对象可以共享其属性(下面的两个例子会详细介绍). function foo(){} fo

关于js里的this关键字的理解_javascript技巧

this关键字在c++,java中都提供了这个关键字,在刚开始学习时觉得有难度,但是只要理解了,用起来就方便多了,下面通过本篇文章给大家详解js里this关键字的理解. 关于this,是很多前端面试必考的题目,有时候在网上看到这些题目,自己试了一下,额,还真的错了!在实际开发中,也会遇到 this 的问题(虽然一些类库会帮我们处理),例如在使用一些框架的时候,例如:knockout,有时候不明白为什么不直接使用this,而要把 this 作为参数传入.    接下来你谈谈我对它的理解,也作为一个

在js里怎么实现Xcode里的callFuncN方法(详解)_javascript技巧

本人使用的WebStorm编辑器,里面没有callFuncN, 不记得Lua是否支持callFuncN,如果不支持相信应该能用同样的方法做到. 废话不多说,贴代码: loadDown : function () { var dis = this.left_move.getPositionY() - this.left.getPositionY(); // 得到一个距离 var act1 = new cc.moveBy(0.5,cc.p(0,-dis)); var act2 = cc.callFu

jquery aja...-$getJSON 在一个js里 这两个请求第二个内容无法运行

问题描述 $getJSON 在一个js里 这两个请求第二个内容无法运行 做一个项目 需要多次请求后台验证 返回json显示结果请求的内容不同 我写第二个$.getJSON的时候 确实访问了后面的url 但是为什么里面的内容无法执行,随便alert(123)都不行 但是第一个$.getJSON里面的内容可以执行 可以对接收的json数据进行判断什么的 有大神知道怎么解决吗

JQuery与JS里submit()的区别示例介绍

 这篇文章主要介绍了JQuery与JS里submit()的区别,需要的朋友可以参考下 ASP.NET 的服务器控件回发是使用这一段JS代码:   代码如下: var theForm = document.forms['form1'];  if (!theForm) {  theForm = document.form1;  }  function __doPostBack(eventTarget, eventArgument) {  if (!theForm.onsubmit || (theFo

jsp-我不懂这个js里的eval函数到底在哪里用到了

问题描述 我不懂这个js里的eval函数到底在哪里用到了 详细的代码如下var navigator_appName = ""chrome"";var window;var dbits;var canary=0xdeadbeefcafe;var j_lm=((canary&0xffffff)==0xefcafe);function BigInteger(abc){if(a!=null)if(""number""==typ