js原型链

下面是一道js题目:
[javascript] view plaincopy
  1. function C1(name){
  2. if(name){
  3. this.name = name;
  4. }
  5. }
  6. function C2(name){
  7. this.name = name;
  8. }
  9. function C3(name){
  10. this.name = name || "John";
  11. }
  12. C1.prototype.name = "Tom";
  13. C2.prototype.name = "Tom";
  14. C3.prototype.name = "John";
  15. console.log(new C1().name + "," + new C2().name + "," + new C3().name);

不运行,求答案!^_^,这道题目对于理解js作用域链十分有用,拿出来和大家分享一下

要做出这道题,最重要是理解js中变量在原型链中查找的顺序,
从内到外大致如下:
本地属性 --->  prototype
变量查找顺序:
能在本地属性中找到的绝不去prototype中找

1).先来分析第一个

[javascript] view plaincopy
  1. new C1().name
  2. function C1(name){
  3. if(name){
  4. this.name = name;
  5. }
  6. }
  7. C1.prototype.name = "Tom";

分析:
由于这里没有参数,默认被赋值成了undefined,所以到了if这里就进不去了,因此在C1本地
属性中找不到name这个属性,只能傻逼兮兮的往外找了,又因为C1.prototype.name = "Tom"的
存在,在prototype中找到了name属性,所以最后打印出来的答案是"Tom"

2).接着来分析第二个

[javascript] view plaincopy
  1. new C2().name
  2. function C2(name){
  3. this.name = name;
  4. }
  5. C2.prototype.name = "Tom";

分析:
由于这次还是没有参数,同样默认被赋值成了undefined,于是本地属性name被赋值成了
undefined。于是在查找的时候一下子就查到了name的值为undefined,
因此C2.prototype.name = "Tom"并没有什么卵用,最终答案为undefined

3).最后来分析第三个

[javascript] view plaincopy
  1. new C3().name
  2. function C3(name){
  3. this.name = name || "John";
  4. }
  5. C3.prototype.name = "John";

分析:
同样是没有参数,undefined作为参数进来以后情况变成了这样:
this.name = undefined || "John",然后结果很明显了本地属性name被赋值成"John"。
接着是从内往外查找,一下子就锁定了本地属性name,此时的值为"John"。
因此C3.prototype.name = "John"同样没有什么用

最后的结果:
这里还有道小菜:
[javascript] view plaincopy
  1. function Foo() {
  2. this.say = function(){
  3. alert('本地方法');
  4. }
  5. }
  6. Foo.prototype.say = function() {
  7. alert('prototype方法');
  8. }
  9. new Foo().say();

总结:

如果原型链上有相同的方法。那么会优先找本地方法,找到并执行,原型链上的方法就不执行了。
同样的,属性的查找也是这么个顺序。

转载于:https://www.cnblogs.com/luckyXcc/p/9160185.html

变量在原型链中的查找顺序相关推荐

  1. js delete删除对象属性,delete删除不了变量及原型链中的变量

    js delete删除对象属性,delete删除不了变量及原型链中的变量 一.delete删除对象属性 function fun(){this.name = 'gg';}var obj = new f ...

  2. javascript原型链中 this 的指向

    为了弄清楚Javascript原型链中的this指向问题,我写了个代码来测试: var d = {d: 40};var a = {x: 10,calculate: function (z) {retu ...

  3. JS原型链中的属性问题

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...

  4. JavaScript——原型/原型链中的顶层对象(图解)

    本篇需要提前了解的知识储备:原型和原型链,以下仅概要介绍,不作详细讲解. 详细学习可参考: JavaScript--面向对象(封装):https://blog.csdn.net/qq_29493173 ...

  5. js原型链中this

    #####原型链中的this是指谁,通过三步确认: 1, 看是谁调用(点之前是谁,就是谁调用) 2, 进行this替换 3, 基于原型链确认结果 举例如下: function Pointer(x,y) ...

  6. 扩展数组方法 给数组原形链追加方法(原型链中的this)

    扩展数组方法 写在前面 1.关于原型链 1.1 故事的开始,手写index 1.2 故事的矛盾点,数组方法直接给Array原形扩展方法 1.3 又一次悟到了原形链 1.4 故事的高潮,发现问题,返现没 ...

  7. C++中类成员变量在初始化列表中的初始化顺序

    引子:我们知道,C++中类成员变量的初始化顺序与其在类中的声明顺序是有关的. 先看代码: 1 class TestClass1 2 { 3 public: 4 TestClass1() { 5 cou ...

  8. JavaScript原型彻底理解2---继承中的原型链

    一.继承的概念 继承是所有的面向对象的语言最重要的特征之一.大部分的oop语言的都支持两种继承:接口继承和实现继承.比如基于类的编程语言Java,对这两种继承都支持.从接口继承抽象方法 (只有方法签名 ...

  9. 前端 JavaScript 原型和原型链

    原型模式: 原型模式是用于创建重复的对象,同时又能保证性能,这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式.这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆. 原型模式的目 ...

最新文章

  1. 投资狂人陈一舟:哪里火爆投哪里
  2. Linux:几个重要的文件处理命令
  3. java 迪杰斯特拉_Java 实现Dikstra迪杰斯特拉算法 关于单源顶点最短路径问题的求解...
  4. 从事java编程技能要求_5道Java视频课程,提高您的编程技能
  5. 【思维】Iranian ChamPions Cup
  6. 整合servlet、整个filter、整合listener、文件上传
  7. DB and RAC(11.2.0.3 ) Patch Set Update(11.2.0.3.6 )
  8. paip.解决中文url路径的问题图片文件不能显示
  9. 台式机黑苹果Mac OS Big Sur 11.3.1安装指引
  10. 近期EI收录的国际会议汇总(AI/CV/深度学习等领域)
  11. Hive窗口函数进阶指南
  12. Linux 内核的网络协议栈
  13. kali虚拟机安装教程
  14. Latex希腊字母对照表
  15. 【HAVENT原创】superagentCallback*** is not defined
  16. 轻量级Kubernetes之k3s:15:firewalld对应方法
  17. 海康监控如何设置STMP邮箱报警
  18. Python常见问题解决办法汇总
  19. 计算机无法识别u盘,详解电脑不识别u盘
  20. OpenCL 学习step by step (11) 数组求和(reduction)

热门文章

  1. 最小延迟调度问题算法c语言,【算法概论】贪心算法:最小延迟调度问题
  2. git branch set-upstream master 分支名/master
  3. 机器学习(MACHINE LEARNING) 【周志华版-”西瓜书“-笔记】 DAY10-降维和度量学习
  4. 安卓import android.support.v7.app.AppCompatActivity报错
  5. 专注年轻人的AI学习平台
  6. python新增练习(二)
  7. vue修改节点class_Vue2.0 源码解读系列 来自 Vue 的神秘礼盒
  8. 构造函数未定义_构造函数(constructor)和观察者模式,谁略胜一筹呢?
  9. elasticsearch:7.9.3 docker 开启日志
  10. C语言中的选择法排序怎么,请问高手们 C语言中选择法排序和冒泡法排序的思想,两种方法有何不同,搞不懂,请举例详细说明一下.谢谢。...