一道有意思的JavaScript 题目

今天在网上看到一道题,觉得很有意思就把它抄下来解了。题目是这样的:

 1            function Parent() {
 2                 this.a = 1;
 3                 this.b = [1, 2, this.a];
 4
 5                 this.c = { demo: 5 };
 6                 this.show = function () {
 7                     console.log(this.a , this.b , this.c.demo );
 8                    /* alert(this.b);*/
 9                 }
10             }
11             function Child() {
12                 this.a = 2;
13                 this.change = function () {
14                     this.b.push(this.a);
15                     this.a = this.b.length;
16                     this.c.demo = this.a++;
17                      /* alert(this.b.length);*/
18                     /*alert(this.b);*/
19                 }
20             }
21             Child.prototype = new Parent();// 继承
22             var parent = new Parent();
23             var child1 = new Child();
24             var child2 = new Child();
25             child1.a = 11;
26             child2.a = 12;
27
28             parent.show();//1 [ 1, 2, 1 ] 5
29             child1.show();//11 [ 1, 2, 1 ] 5
30             child2.show();//12 [ 1, 2, 1 ] 5
31
32             child1.change();
33             child2.change();
34
35             parent.show();//1 [ 1, 2, 1 ] 5
36             child1.show();//5 [ 1, 2, 1, 11, 12 ] 5
37             child2.show();//6 [ 1, 2, 1, 11, 12 ] 5

下面让我们来跟着运行结果分析代码:

第一: parent.show();//1 [ 1, 2, 1 ] 5 :调用自己的方法,自己的属性,这个就比较简单了。 就不多说。

第二: child1.show();//11 [ 1, 2, 1 ] 5 :我们知道,Child 继承了parent ,而child1 是Child 的实例,所以此时看图:

因为 child1.a=11;所以child1.show 的时候 使用的是自己的 a这个值,与此同时,child1中没有b,所以根据原型链搜查值原理,这个会顺着原型链往上找,直到找到 Parent 中,而此时使用的就是Parent 的值,而因为this 是看谁在使用它,就指向谁,而此时使用的是此时是 Parent中的b ,故可以理解成 Parent.b=[1,2,Parent.a];  而 this.c = { demo: 5 },因为child 1也没有 c ,所以会找到 Parent 中的c ,故此时就是 11 [1,2,1] 5

child2 情况如同child 1.

child1.change();
child2.change(); //经历了这两个函数, this.b.push(this.a); this.b这个数组中压入值,第一次压入11,第二次压入12.    this.a = this.b.length; 将数组的长度赋值给a,第一次压入后长度是4 ,第二次是5 故this.c.demo = this.a++; 中 this.c=5,这里考察了a++赋值,先赋值后++ 。此时数组变成[1,2,1,11,12]

这里提一下:child1.change()时 this.c=4,而this.a++在赋值之后自增变成5.child2.change()时 this.c=5;而this.a++自增变成6. (我特地写这这两段是因为我在考虑自增的时候很郁闷,因为当child2.chang()已经执行完后,this.a++自增变成6 ,那么child1.show 和child2.show 为什么输出不同的this.a呢? 这个问题就考虑到了深复制的问题,child1与child2对child是深复制,他们之间的私有变量不会互相影响,而他们对parent是浅赋值,所以会共享this.c.demo的值。)

*值得注意的是,当执行child1.chang() 和child2.chang()之后,他们两个都给自己添加了变量c.demo ,但是实际上并不会影响到parent 自身的c.demo的值,parent.show中调用的依旧是自己的c.demo,您可以修改parent中 demo的值就可以明显看出来了。

原文地址:https://www.cnblogs.com/wxhhts/p/9499265.html

时间: 2024-10-04 23:24:32

一道有意思的JavaScript 题目的相关文章

我觉得有意思的JavaScript题目(01-05更新中)

对于以下js题目均来至于网络中.有的来至于文章之中,有的也许来至于问答题型中. 如果你有更好的问题解释,请留言交流! 1.相关问题描述:到底该怎么去理解闭包? 代码片段A: !function(){ var num=1; var exp={}; functionadd(num){ return num++; } exp.getAddNum=function(){ return add(num); } window.a=exp; }() console.log(a.getAddNum()); //

考考你!一道有趣的Javascript小题目

今天的内容很简单,给大家分享一个有趣的Javascript小题目. 题目很简单,就是填空: var a = ______; var b = a;alert(a==b); // alert "false" 请将程序补充完整,使得弹出的对话框显示为"false". 先答出的有奖哦 ^ ^ --------------------- 用简单而风趣的形式表达出自己的想法是我一直追求的目标(当然,目前还处于"XX主义初级阶段",还有很长的路要走). 如果你

unity一道有意思的面试题

学校享受的日子一去不复还了,呜呜.话说面试了几个公司,真心没准备好就上了,结果当然是小悲催.还好有容身之处,就算是搬砖,也有可能为自己盖楼,吼吼. 好,下面我来分享一道有意思的面试题,说他有意思,是因为这个题目的意义很重要的,好了不卖官司了,先看看题目: 三维空间,Y轴朝上,重力加速度为大小为g, 已知A(x1, y1, z1), B(x2, y2, z2)是三维空间中的两个点,现在从A点发射一个物体,希望该物体经过时间t之后,落在B点,请给出计算发射速度向量. 说到这,请把unity相关的AP

看看国外的javascript题目,你能全部做对吗?(分享)

本文转自@Aaron的博客,拿过来分享一下.原文:看看国外的javascript题目,你能全部做对吗? 题目一: (function(){ return typeof arguments; })(); "object" arguments是对象,伪数组有两件事要注意这里: 参数不是数组,它是一个数组一样的物体,你可以使用方括号和整数索引的元素,但方法通常可在一个如推上不存在参数数组 Array.prototype.slice.call(arguments); 转成数组 当然argume

几个有意思的算法题目

这两天奔波于参加了两场校招面试,其中有很多非常有意思的算法题目,有一部分甚至都没有找到最优的答案,比较开放的算法设计题目. 其实面试不只是算法题的交流,当中还穿插着各式各样的非技术问题,毫无防备,都不知道如何展示自己了. 看似数学推理的程序设计题: 一个盒子中有100个白球,100个黑球,每次从盒子中不放回的取出两个球,如果取得的两个球是颜色相同,放入一个白球,如果取得的两个球颜色不同,放入一个黑球?最后盒子中剩下一个黑球的概率为多少? 拓展:一个盒子中有m个白球,n个黑球,按照上面的方案,最后

一道有意思的C语言编程题

最近在看经典的C语言入门书籍K&R,虽然是一本入门书籍,可是其中的精妙之处却需要慢慢体会.其中的经典题很多,仔细琢磨一定会收获良多. 今天看到这样一道题:编写一个删除C语言程序中所有的注释语句.感觉颇有意思,与大家一起分享一下: 我的思路: 找到注释的起始符号 \ 判断紧接着的输入字符,如果是*或者是\,则说明后面全是注释,跳过即可,否则照样输出 其他则直接输出 疑问: 所配套的答案书中提出要考虑引号后面的内容以做出响应,不是很明白这是为什么.个人认为无需考虑引号的影响也能将注释去除,希望有高手

约瑟夫环问题,一道经典的数据结构题目

问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数.求胜利者的编号. 一般我们采用一个循环队列来模拟约瑟夫环的求解过程,但是如果n比较大的时候,采用模拟的方式求解,需要大量的时间来模拟退出的过程,而且由于需要占用大量的内存空间来模拟队列中的n个人,并不是一个很好的解法. 在大部分情况下,我们仅仅需要知道最后那个人的编号,而不是要来模拟一个这样的过程,在这种情况下,可以考虑是否存在着一种数学公式能够直接求出最后那个人的编号. 我们知道第一个人(编号

转换二进制数(这是一道竞赛形式的题目)。

1. 题目介绍 转换二进制数(这是一道竞赛形式的题目). 时限:3s输人文件: change.in 一串串太多太长的二进制数真是枯燥乏味,难怪小明看着看着就看花眼了;小亮看着看着就睡着了;小晶看着看着就恐慌起来了,仿佛自己变成了机器人,原本丰富多彩的世界一下子成了0和1的汪洋大海.他们一致要求将这些二进制数转换成十进制数,只有这样,心里才安稳,才痛快,睡觉才合得上眼. 这项工作自然就落到你的手里了,因为早就听说你是处理二进制数的高手了,一点也不怀疑你会一下子想出十七八种转换的方法,而且其中还有几

分享一道我认为非常有思考价值JavaScript题目

这是一道综合性的题目,如果你能快速清晰的分析整理出来,那我相信你对JavaScript是有一定的理解的了.我会先将题目的图片截取出来,供大家思考,在结尾在给出我的分析过程和答案,作个总结. 好,废话不多说啦,我们马上来看看! 好,希望大家现在好好思考一下,result的值会是多少.下面我会给出答案. 我们用node打印一下看看 答案是 -2,亲爱的朋友们,你做对了吗? 下面我将写出我对这题的思路解析,仅供参考噢. 我们直接看到函数调用 partialFn(f, 2) ,这里的意思就是传入两个参数