`
北极的。鱼
  • 浏览: 150920 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

【转】用调试工具来理解JS中的prototype属性。

阅读更多

原始地址:http://qiang106.iteye.com/blog/575424

 

    首先这次我们来看看Javascript的prototype有有以下几个特性:
一、我们知道,JS类可以理解成一个构造方法,用new创建一个JS类的对象时,类构造方法会被指定一个prototype属性,这个prototyep我们把它叫做JS类的的原型,原型的初始值是一个对象,这个对象只带有一个属性名为constructor,它指回到和原型关联的那个构造方法;
二、原型的属性,在所有这个JS类的对象实例中共享;
三、当JS程序读取对象中属性时,首先读取的是对象中定义的属性,如果属性不存在,则到对象的原型中搜索,这也体现JS的继承扩展特性,如果原型中也没有这个属性当然就出错啦;
四、当在JS程序中写一个属性时,情况不会像第3点说的那样了,如果对象中没有定义这个属性不存在,那么这个在这个对象中就会添加这一个属性,即使原型中定义了这个属性,那么也只能说明添加的这个对象的属性和原型的属性同名。

现在就开始让我们来“调”出这几个特性吧,参考以下程序代码:

<script language="javascript">
	function test(){
		var T = function(){};
		var t1 = new T(),t2 = new T();
		T.prototype.attr = 1;
		var result1 = t1.attr;
		T.prototype.attr = 2;
		var result3 = t2.attr;
		t1.attr = 2;
		var result2 = (t1.attr == t2.attr);
		t2.attr = 3;
		var result4 = T.prototype.attr;
		document.writeln(result1);
		document.write("<br>" + result2);
		document.write("<br>" + result3);
		document.write("<br>" + result4);
	}	
</script>

 1、在IE8或者FireBug中定义如下断点


 

2、当程序跑到这里时,我们看变量情况如下:


 

3、T中只是一个空对对象,什么属性也没有,再按F11两次单步执行,此时完成var t1 = new T(),我们再看变量T:



 
4、此时已经多了一个prototype属性,并且这个属性包含一个constructor的属性,这个属性是一个方法,实际它就是指向了原型相关的构造方法,即T的构造方法,再观察,我们发现此时t1和t2中都没有attr属性,继续F11,下一行是指给T的原型添加一个属性,并赋值为1,当程序执行完这一行后我们发现t1和t2也多了一个属性attr,这个属性实际上是从原型那承下来的,当然值也是等于1,如下图:


5、继续按F11,T.prototype.attr = 2;这一行是改变原型的值,当过完这一行,发现变量有变化了,t1,t2的attr的值也都变成了2,这也再次证明t1,t2的attr正是继承自原型,自然result2的值也为true了,如下图:



 

6、再往下t2.attr = 3;改变了t2的attr,此时是写t2的attr,写与读不一样,它会在对象中添加一个新的属性,如下图,此时原型的attr并没有变成3,只有t2的attr为3:



 7、而t1.attr2 = 4;这一步也再次说明了在对象中添加一个新的属性,最终截图效果



 

在浏览器也输出了:

1 
true
2
2 

 

通过这样简单的几步调试,观察其中变量变化,清楚地让我认识了prototype的这几点特征,发现调试有时也不仅只是用来调试我们程序对与错,有时还能帮助我们很直观的理解程序甚至语言运行的一些特征,各位XDJM有其它更准确的理解或者更好的方法,还请不吝赐教,在此谢过。

  • 大小: 1.8 KB
  • 大小: 2.3 KB
  • 大小: 2.3 KB
  • 大小: 4.9 KB
  • 大小: 4.1 KB
  • 大小: 4.9 KB
  • 大小: 5.5 KB
分享到:
评论

相关推荐

    JavaScript中对象的prototype属性代码实例

    我猜一般用过JavaScript的人都看见过或者用过对象的prototype属性。这是个好东西,它可以向其原型中动态添加功能(属性和方法),但该对象不能被赋予不同的原型。然而,用户定义的对象可以被赋给新的原型。详细介绍:...

    简单理解js的prototype属性及使用

    在进入正文之前,我得先说说我认识js的prototype这个东西的曲折过程。 百度js的prototype的文章,先看看,W3School关于prototype的介绍: 你觉得这概念适合定义js的prototype这个东西吗?你是否也认为prototype是...

    js遍历属性 以及 js prototype 和继承

    NULL 博文链接:https://jinhailion.iteye.com/blog/1530966

    js的Prototype属性解释及常用方法

    每一个构造函数都有一个属性叫做原型(prototype,下面都不再翻译,使用其原文)。这个属性非常有用:为一个特定类声明通用的变量或者函数。 prototype的定义 你不需要显式地声明一个prototype属性,因为在每一个构造...

    JavaScript prototype属性详解

    每个函数都有一个prototype属性,这个属性是指向一个对象的引用,这个对象称为原型对象,原型对象包含函数实例共享的方法和属性,也就是说将函数用作构造函数调用(使用new操作符调用)的时候,新创建的对象会从原型...

    prototype的JS文件prototype的JS文件

    prototype的JS文件prototype的JS文件prototype的JS文件prototype的JS文件

    理解JavaScript的prototype属性

    其实,关于prototype只要几句话就可以总结: 任何原型都是对象,只有对象有原型 只有Function有prototype属性,它是这个Function作为构造器时生成对象所继承的原型。Function的原型和它的prototype属性无关 对象的...

    关于JS中prototype的理解.docx

    关于JS中prototype的理解.docx

    js资料prototype 属性

    说明 用 prototype 属性提供对象的类的一组基本功能。对象的新实例“继承”赋予该对象原型的操作。 例如,要为 Array 对象添加返回数组中最大元素值的方法。要完成这一点,声明该函数,将它加入 Array....

    谈谈js中的prototype及prototype属性解释和常用方法

    prototype是javascript中笔记难理解的一部分内容,下面通过几个关键知识点给大家讲解js中的prototype,对js中的prototype相关知识感兴趣的朋友一起学习吧

    开源JS包Prototype使用指南

    开源JS包Prototype使用指南开源JS包Prototype使用指南开源JS包Prototype使用指南开源JS包Prototype使用指南开源JS包Prototype使用指南

    JS中的prototype

    Prototype(原型)是js中很重要的一部分,对象的创建和继承的模拟都要通过原型去实现.通过本文档,能让你对javascript中的原型有一个初步的了解.

    JavaScript prototype对象的属性说明

    一、什么是JavaScript中对象的prototype属性 JavaScript中对象的prototype属性,是用来返回对象类型原型的引用的。我们使用prototype属性提供对象的类的一组基本功能。并且对象的新实例会”继承”赋予该对象原型的...

    JavaScript中的prototype(原型)属性研究

    JavaScript中的prototype(原型)属性研究

    js中prototype1

    js中prototype1

    JavaScript中prototype的使用

    JavaScript中prototype的使用

    JavaScript使用prototype属性实现继承操作示例

    本文实例讲述了JavaScript使用prototype属性实现继承操作。分享给大家供大家参考,具体如下: JS并没有显式的继承语法,在JS中所有的对象都是Object的子类实现, 因而对象之间是平等关系. 尽管如此我们可以通过特殊的...

    JS:prototype用法

    JS:prototype用法

Global site tag (gtag.js) - Google Analytics