`
qiang106
  • 浏览: 388018 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

用JS调试来理解JS的prototype某些特性

阅读更多
    首先这次我们来看看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
2
0
分享到:
评论

相关推荐

    prototype 1.6中文手册 chm+prototype 1.6.js源码 最新版

    在基础概念中,读者可以了解到Prototype如何扩展JavaScript的基本类型,如Array、String和Function,以及如何使用$$选择器来快速选取DOM元素。对象操作部分则讲解了Prototype如何支持面向对象的编程,如Class构造...

    Prototype.js学习从简单开始

    在开始学习前,推荐使用Firefox浏览器并安装Firebug(或现代替代品如Chrome DevTools)和IE Tab插件,前者用于查看和调试JS、CSS代码及DOM结构,后者则便于在不同浏览器间切换测试页面效果。 #### 元素定位示例 ...

    prototypejs1.6.1_rc2最新版

    PrototypeJS 是一个广泛使用的JavaScript库,它为Web开发提供了丰富的功能和便利,特别是在处理DOM(文档对象模型)操作、AJAX交互以及创建可复用的JavaScript组件方面。标题中的"prototypejs1.6.1_rc2最新版"指的是...

    prototype1.7.2

    《Prototype JavaScript 框架详解:以 ...学习和掌握 Prototype,不仅能提升开发效率,还能加深对 JavaScript 语言特性的理解。无论你是初学者还是经验丰富的开发者,Prototype 都值得你投入时间去研究和使用。

    在vs2005基于prototype.js的模态弹出窗口

    总结来说,"在VS2005基于Prototype.js的模态弹出窗口"这个主题涵盖了前端开发中的多种技术,包括使用Visual Studio 2005进行项目开发,结合Prototype.js库创建动态效果,以及理解和实现模态弹出窗口的基本机制。...

    JS:typeof instanceof constructor prototype区别

    在JavaScript(JS)编程语言中,确定变量或对象的类型是一项基本且重要的任务。这不仅有助于理解代码的行为,还能在调试、数据验证以及实现特定功能时提供帮助。本文将深入探讨四种常用的方法来识别和判断JavaScript...

    prototype中文参考手册(chm)+js文件

    《Prototype中文参考手册》与相关的JS文件是JavaScript开发者学习和使用Prototype库的重要资源。Prototype是一个开源的JavaScript框架,它提供了一系列强大的工具,旨在简化DOM操作,增强AJAX功能,并为JavaScript...

    prototype.js

    总的来说,prototype.js 是JavaScript世界中一个里程碑式的库,它极大地推动了Web2.0的发展,并启发了许多后续的JavaScript框架和库。通过深入学习和使用prototype.js,开发者能够提升网页的互动性和用户体验,同时...

    Prototype1.6.0在IE8 9下的问题

    然而,由于IE8和IE9的浏览器内核与现代浏览器有显著差异,它们可能不完全支持某些先进的JavaScript特性,导致使用Prototype时会出现问题。 描述中提到的“NULL”可能是错误信息的一部分,通常在JavaScript中表示...

    prototype学习笔记

    至于"工具"标签,可能指出了开发者可以使用的工具和技巧,比如使用`console.log()`或第三方库如`lodash`来检查和操作`prototype`,或者使用某些IDE和代码编辑器的特性来更好地理解和调试`prototype`相关的代码。...

    prototype.js1.6的帮助文档

    Prototype.js 的事件处理系统支持事件委托,可以使用`Event.observe()`和`Event.stopObserving()`来添加和移除事件监听器。`Event.stop()`可以阻止事件冒泡,而`Event.simulate()`则允许模拟事件。 4. **Ajax交互*...

    prototype-js

    Prototype JS 引入了基于原型的继承机制,使得JavaScript具备了更完善的面向对象特性。它通过`Object.extend()`方法实现类的继承,通过`Class.create()`创建新类,以及`instanceOf`检查实例所属的类。此外,还有`...

    prototype从入门到精通

    2. **性能优化**:理解Prototype如何缓存DOM查询、合理使用事件委托等技巧,可以显著提升页面性能。 3. **错误处理和调试**:Prototype提供了异常处理机制和调试工具,如`try/catch`语句以及`console.log()`等,有...

    javaScript 中文开发文档

    11. **调试和优化**:了解如何使用开发者工具进行代码调试和性能优化是每个JavaScript开发者必备的技能。包括设置断点、分析调用栈、检查内存使用情况等。 12. **跨域通信**:CORS(跨源资源共享)是允许不同源的...

    让ecside2离开prototype.js

    在Web开发中,Prototype.js是一个常见的JavaScript库,它提供了一系列实用的函数来扩展JavaScript的基本对象和功能。然而,随着Web开发技术的演进,有些开发者可能需要将特定的组件或自己的代码与Prototype.js解耦,...

    javascript_js教程

    JavaScript,简称JS,是一种广泛应用于Web开发的轻量级编程语言,主要负责网页的动态交互。作为初学者,了解并掌握JavaScript的基础知识至关重要。中兴培训PPT中的内容可能涵盖以下核心概念: 1. **基础语法**:...

    基于prototype的放大镜插件

    在本文中,我们将深入探讨如何使用Prototype JavaScript框架创建一个基于原型的放大镜插件。这个插件主要用于在网页上实现图片的局部放大功能,适用于Internet Explorer(IE)和Firefox等主流浏览器。 首先,我们来...

    编写javascript插件,来扩展已有的JavaScript功能.zip

    编写JavaScript插件通常涉及对原型(Prototype)的理解和利用,这是JavaScript实现面向对象编程的关键特性。 标题中的“编写javascript插件,来扩展已有的JavaScript功能”意味着我们将探讨如何通过创建自定义函数...

    JS Ajax XML 处理 (prototype)

    在Prototype中,我们可以使用`Ajax.Request`或`Ajax.Updater`来发起Ajax请求。`Ajax.Request`用于发送请求并处理响应,而`Ajax.Updater`则会在请求完成后更新指定的DOM元素。 ```javascript new Ajax.Request('url'...

    Linux 桌面玩家指南:19. 深入理解 JavaScript,及其开发调试工具 - 京山游侠 - 博客园1

    【深入理解JavaScript及其开发调试工具】 JavaScript是一种广泛用于网页和网络应用的编程语言,它主要负责客户端的交互逻辑,使得网页动态化、响应用户操作。本文将深入探讨JavaScript的核心概念,包括对象和原型链...

Global site tag (gtag.js) - Google Analytics