`
babydeed
  • 浏览: 237936 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

js原型分析研究

    博客分类:
  • Ext
 
阅读更多

    原型是个很微妙的东西,很多人不是很理解,理解了原型对于研究其他js类的框架(比方Extjs)很有帮助.
   下面我们开始讨论下原型,对于理解js中的原型概念十分重要。简单来说,一个原型类似其他语言中的一个类,它定义的属性且可以被此类产生的所有对象所共享。然而它又不像一个类,原型可以在运行时获得和改变。可以增加属性到原型上或者删除原型上已经存在的属性。所有的变化将立即影响由原型派生的对象。它是如何工作的呢? js是一种动态的语言,它不是在编译期间去搜索属性值,而是在执行请求期间去搜索属性值。例如,考虑一个基本的继承案例,A的原型继承自B的原型,a对象是由A的原型派生出的对象.如果对象a上的一个属性被请求,则js表现出如下搜索过程:

  1. js首先检查a对象上是否存在此属性,如果没有搜索到,则进行第2部分搜索过程。

  2. js访问A的原型检查是否有此属性,如果仍然没搜到,则进行第3部分搜索过程。

  3. js最后访问B的原型检查是否有此属性.如果没有搜到将访问每个父类对象上的原型直到达到根原型上。这样的一个搜索过程称原型链

  如下图所示:



 


下面我来出一个js原型的题目:

 

function F() { } 
F.prototype.someProperty = 'prototype property';
var a = new F(); 
alert(a.someProperty); 
a.someProperty = 'object property'; 
alert(a.someProperty); 
a.someProperty = undefined; 
alert(a.someProperty); 
delete a.someProperty 
alert(a.someProperty); 

 

 

 

 

1=》'prototype property'
2=》'object property'
3=》undefined
4=>'prototype property' 

 

解析:第1个先搜索a对象上是否存在someProperty属性,发现没有,则搜索它的原型发现有someProperty属性          值返回。
     第2个依然先搜索a对象上是否存在someProperty属性,发现有,返回。
     分析第3个前说下  a.someProperty = undefined; 虽然赋值undefined但a对象上依然有someProperty属性。
     所以 第3个依然先搜索a对象上是否存在someProperty属性,发现有,返回
     所以 第4个依然先搜索a对象上是否存在someProperty属性,由于delete a.someProperty此操作已经删除了a对象上的someProperty属性,  所以搜索它的原型发现有,返回。
到此大家应该对原型有一个比较清楚的认识。


js中创建对象方式一般如下:
function f(){
}
js每次声明新函数的过程中,都会为其创建一个 prototype 的属性。在未加其他附带条件情况下,所有函数的 prototype 属性有一个 constructor 属性,constructor 包含一个指向 prototype 属性所属函数的指针(就是说 constructor 回指构造函数本身),这表明alert(f.prototype.constructor ==f)结果为true。
分析图如下:



 


下面讲讲2个写法的区别:
  方式1:function f(){
             this.name="xxx"
         }
  方式2:function f(){
         } 
         f.prototype.name="xxx";
对于以上2种方式定义,如果var f1 = new f()  虽然alert(f1.name)效果一样,但是对于方式1,有f产生的对象每个上面都有name属性,即每个对象都有一份内存使用,如果函数f内定义的属性更多那么占用的内存可想而知非常大;对于方式2,有f产生的对象每个上面都没有name属性,搜索属性时会按照上文搜索过程最终找到"xxx";所以方式2更加优化。


对于上文如果大家都能理解,我们趁热打铁,说下js的继承。
下面是一种实现js继承的方式
function father(){
}
function sun(){
}
sun.prototype=new father();
//这样子类产生的对象都会有父类中的属性,按照之前的原型查找机制很容易理解
sun.prototype.constructor=sun();//由于上一句造成子类的构造函数变成父类的所以子类的构造函数还需还原回来


这样就完成了继承。当然通过前文的分析,此写法还有点缺陷,在内存上不是很优化。
其实可以使用一个空函数作为中介实现更优化的继承。此写法可以参数Extjs2,3版本中继承中的写法。如果本文到此为止您都能懂,想必你完全能看懂ext中继承的写法。今天先写到这里,下次我们分析下ext中的继承写法。


  • 大小: 9.5 KB
  • 大小: 15.6 KB
分享到:
评论
1 楼 dzhh2011 2012-07-25  
说的真明白

相关推荐

    OA系统_原型+需求分析

    需求分析是项目启动前的重要阶段,它涉及到对OA系统功能、性能、用户群体等方面的深入研究。在需求分析文档中,通常会包括以下内容: 1. **系统目标**:明确OA系统要解决的问题,提升的办公效率,以及满足的具体...

    客户分析原型

    在客户分析中,这些工具可以处理来自多个源的数据,例如销售记录、客户行为日志、社交媒体反馈等,然后通过交互式报表展示这些信息,以便用户进行深入研究。例如,可以生成关于客户群体的特征分析、购买行为模式、...

    UI原型原文件

    5. **学习资源**:对于初学者,这个压缩包提供了一个实践学习的平台,可以通过分析和修改这些文件来提升自己的HTML、CSS和JavaScript技能。同时,也可以了解到UI/UX设计的基本原则,如布局、色彩理论、可用性和可...

    JavaScript_原型UI元素的集合.zip

    总结来说,"JavaScript_原型UI元素的集合.zip"这个压缩包提供了一套关于JavaScript原型机制和UI元素实现的实践教程。通过学习和研究,开发者不仅可以掌握JavaScript对象继承的原理,还能了解到如何用JavaScript高效...

    用于数据分析原型的设计和代码最初用于SpaceX

    这个名为"Sciview-master"的压缩包文件,很可能包含了一个基于JavaScript开发的数据分析原型项目,它可能是为了支持SpaceX在数据探索、模型构建和决策制定方面的需要。 JavaScript是一种广泛应用于前端开发的编程...

    原型链全套图解.rar

    在JavaScript中,原型链是理解对象继承和属性查找机制的关键概念。它是一种基于原型(prototype)的继承方式,使得一个对象能够从另...本压缩包中的图解资料将帮助你以视觉化的方式加深对原型链的理解,推荐仔细研究。

    OA系统原型HTML

    在“社科院OA系统原型”中,我们可以推测这可能是针对社会科学研究机构定制的OA系统,可能包含特定的研究项目管理、文献资料库、学术交流等功能,以适应科研工作的特点和需求。 HTML作为原型设计,意味着开发者可能...

    30款静态页面原型

    通过对这些原型的分析和研究,我们可以了解到当前的设计趋势,提升设计技巧,同时也能为自己的项目提供有价值的参考。在实际工作中,可以结合业务需求,灵活借鉴和改造这些原型,以实现更符合用户需求的页面设计。

    JavaScript继承机制研究.pdf

    在本文中,我们将深入探讨JavaScript继承机制的实现方式,并对基于原型的继承、构造函数方式继承、组合继承、寄生式继承等继承机制进行了总结归纳和分析。 基于原型的继承 JavaScript是一门基于原型的语言,它不像...

    javascript网页制作彻底研究源代码

    首先,JavaScript是一种解释型的、基于原型的脚本语言,它主要用于网页和网络应用的交互。通过JavaScript,我们可以实现动态内容更新、表单验证、页面导航控制等,极大地提升了用户体验。书中可能涵盖的基本语法包括...

    BBS论坛原型jsp-bbs

    通过深入研究和分析这个【BBS论坛原型jsp-bbs】源码,你可以掌握Web开发的基本流程,理解后端与前端的协作方式,以及如何设计和实现一个简单的社交应用。这将为你的Java Web开发技能打下坚实的基础。

    需求原型,HTML原型,在线撰写平台详细需求设计,需求考察

    在线撰写平台是一种允许用户在线创建、编辑和分享文档的工具,常见于协作办公、学术研究和创意写作等领域。设计这样的平台时,需求分析是首要任务,包括确定用户角色、功能需求、性能指标以及用户体验等方面。例如,...

    JavaScript图书数据可视化分析系统源码.zip

    《JavaScript图书数据可视化分析系统源码》是一款基于JavaScript编写的软件,主要应用于图书数据的可视化分析。这个系统利用了ECMAScript(JavaScript的标准版本)的强大功能,为前端开发者提供了丰富的工具,以帮助...

    JS的代码模式分析

    "JS的代码模式分析"着重关注的是如何识别和理解JavaScript代码中的常见模式,以及如何有效地管理和复用这些模式。 在JavaScript包或文件中,我们经常发现一些重复的代码结构,这些结构可以被抽象成代码模式。这些...

    javascript分析

    源码分析通常指的是对JavaScript代码进行深入研究,理解其工作原理,优化性能,或者查找和修复bug。这可能包括了函数的实现、对象和数据结构的使用、事件处理、DOM操作等方面。在JavaScript中,深入理解原型链、闭包...

    小语种考试产品原型.zip

    通过深入研究和学习提供的产品原型,可以了解小语种考试产品的设计思路,理解不同功能的实现方式,对于提升产品设计和开发能力具有很大的帮助。同时,这也可以作为案例研究,为其他教育类产品的开发提供借鉴。

    管家帮新平台原型_产品部_4-6.zip

    这通常意味着内部进行了多次讨论、用户研究、竞品分析,最终形成了这个原型,以展示新平台的主要特性、用户体验设计以及业务流程。 【标签】虽然没有提供具体的标签,但我们可以推测,相关的标签可能包括“产品原型...

    新南威尔士州研究原型

    3. **数据处理**:JavaScript也可以用于处理和分析研究数据,例如使用像D3.js这样的数据可视化库来展示研究成果。 4. **测试**:利用Mocha、Jest等JavaScript测试框架确保代码质量,验证功能正确性。 5. **模块化*...

    Dart VS JavaScript上篇:JavaScript的历史包袱.docx

    本文将从 JavaScript 的历史包袱、Google 对 JavaScript 的看法、Dart 语言的出现等方面,分析 JavaScript 和 Dart 语言的关系、特点和发展前景。 一、JavaScript 的历史包袱 JavaScript 作为一门脚本语言,具有...

    《高性能JavaScript编程》.Nicholas.C.Zakas著.英文版

    3. **原型与继承**:书中讲解了JavaScript的原型链机制,以及如何利用原型实现类式的继承,同时对比了与其他语言的继承方式。 4. **性能优化**:Zakas强调了DOM操作的性能影响,提出了一些减少DOM操作的策略。他还...

Global site tag (gtag.js) - Google Analytics