变量在原型链中的查找顺序

js原型链

下面是一道js题目:

[javascript] view plain copy

  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 plain copy

  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 plain copy

  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 plain copy

  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 plain copy

  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

时间: 2024-10-11 16:23:08

变量在原型链中的查找顺序的相关文章

关于JS中原型链中的prototype与_proto_的个人理解与详细总结(代码示例+高清无码大图!——自备瓜子花生)

一直认为原型链太过复杂,尤其看过某图后被绕晕了一整子,今天清理硬盘空间(渣电脑),偶然又看到这图,勾起了点回忆,于是索性复习一下原型链相关的内容,表达能力欠缺逻辑混乱别见怪(为了防止新人__(此处指我)__被在此绕晕,图片就放在末尾了.) 以下三点需要谨记 1.每个对象都具有一个名为__proto__的属性: 2.每个构造函数(构造函数标准为大写开头,如Function(),Object()等等JS中自带的构造函数,以及自己创建的)都具有一个名为prototype的方法(注意:既然是方法,那么就

JavaScript原型链中toString()方法输出alert()和console.log()得到不同的结果

<script language="javascript"> function myObj(){ var total = 0; } myObj.prototype.add = function(a,b){ this.total = a + b; } myObj.prototype.toString = function(){ return this.total; } var obj = new myObj(); obj.add(1,2); console.log(obj);

你不知道的JavaScript--Item15 prototype原型和原型链详解

用过JavaScript的同学们肯定都对prototype如雷贯耳,但是这究竟是个什么东西却让初学者莫衷一是,只知道函数都会有一个prototype属性,可以为其添加函数供实例访问,其它的就不清楚了,最近看了一些 JavaScript高级程序设计,终于揭开了其神秘面纱. 每个函数都有一个prototype属性,这个属性是指向一个对象的引用,这个对象称为原型对象,原型对象包含函数实例共享的方法和属性,也就是说将函数用作构造函数调用(使用new操作符调用)的时候,新创建的对象会从原型对象上继承属性和

JavaScript学习--Item15 prototype原型和原型链详解

用过JavaScript的同学们肯定都对prototype如雷贯耳,但是这究竟是个什么东西却让初学者莫衷一是,只知道函数都会有一个prototype属性,可以为其添加函数供实例访问,其它的就不清楚了,最近看了一些 JavaScript高级程序设计,终于揭开了其神秘面纱. 每个函数都有一个prototype属性,这个属性是指向一个对象的引用,这个对象称为原型对象,原型对象包含函数实例共享的方法和属性,也就是说将函数用作构造函数调用(使用new操作符调用)的时候,新创建的对象会从原型对象上继承属性和

图解JavaScript中的原型链

转自:http://www.jianshu.com/p/a81692ad5b5d typeof obj 和 obj instanceof Type 在JavaScript中,我们经常用typeof obj和obj instanceof Type来识别类型,那么两者的区别在哪?先来看两段代码 <!--typeof obj的方式判断--> <script>    var str = "toby";    console.log(typeof str);// stri

javascript中的原型和原型链(二)

原型(prototype) 函数的 prototype 属性(图) 每个函数都有一个prototype属性,它默认指向一个Object空对象(即称为:原型对象) 原型对象中有一个属性constructor,它指向函数对象 给原型对象添加属性(一般都是添加方法) 作用:函数的所有实例对象自动拥有原型中的属性(方法) 显式原型与隐式原型 每个函数 function 都有一个prototype属性,即 显式原型 每个实例对象都有一个__proto__,可称为隐式原型 实例对象的隐式原型的值 === 其

js中的原型与原型链详解

js中的原型与原型链详解 记住下面三句话就可以理解原型: 所有的函数数据类型都天生自带一个属性Prototype(原型)这个属性的值是一个对象,浏览器会默认给他开辟一个堆内存 在浏览器给prototype开辟的堆内存当中有一个天生自带的属性是constructor,这个属性存储的值是当前函数本身 每一个对象都有一个__proto__的属性,这个属性指向当前实例所属类的prototype(如果不能确定他是谁的实例,都是Object的实例) 原型链:如果引用构造函数的实例想要查找某个属性p的话: 首

理解js中的原型链,prototype与__proto__的关系

说到prototype,就不得不先说下new的过程. 我们先看看这样一段代码: 1 <script type="text/javascript"> 2 var Person = function () { }; 3 var p = new Person(); 4 </script> 很简单的一段代码,我们来看看这个new究竟做了什么?我们可以把new的过程拆分成以下三步: <1> var p={}; 也就是说,初始化一个对象p. <2>

JS中注意原型链的“指向”

昨天压缩Js文件时发现了项目中的一个prototype的问题代码如下所示: 1. <script> var XXX = function(){ }; var x1 = new XXX(); XXX.prototype.fnx = function(){ alert("123"); } x1.fnx(); </script> 2. <script> var XXX = function(){ }; var x1 = new XXX(); XXX.pro