Javascript原型对象、this的5钟用法、原型继承、Caller和Callee的使用.docVIP

Javascript原型对象、this的5钟用法、原型继承、Caller和Callee的使用.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Javascript原型对象、this的5钟用法、原型继承、Caller和Callee的使用

学习笔记---Javascript原型对象、this的5钟用法、原型继承、Caller和Callee的使用 1. 在Javascript中, 每定义一个函数, 将伴生一个原型对象. 原型就是用来为同一类对象共享类型信息的, 即每一个通过该函数创建的对象都可以共享函数原型上的信息. 也就是说, 当我们定义一个函数的时候, 实际上得到了两个对象, 一个函数对象, 一个原型对象. ? 2. 在通过函数并使用new创建对象的过程中, 系统将完成三件事情: a. 创建一个对象实例, 该实例上没有该实例自己定义的成员. b. 将这个对象实例的prototype(原型)成员指向创建它的函数的原型对象. c. 执行构造函数, 在函数执行过程中, this就表示刚刚创建的对象. ? 函数是一种特殊的对象. 实际上, 任何对象都有原型, 只不过普通对象的原型不能修改, 而函数对象的原型则可以修改. 原因很简单: 因为任何对象都是通过函数(类函数)来创建的, 当对象实例被创建后, 对象实例的prototype就会指向类函数的原型. ? 3. 类及对象的继承: 在Javascript中没有类的概念, 但可以通过函数来模拟. Javascript中的对象是通过函数来创建的, 在系统中预定义了8中特殊的函数, 用来创建对象, 这些函数有时被称为”类函数”或者类. 参考下图: ? 如图所示: Object函数对象是Javascript中定义的顶级函数对象, 在Javascript中的所有对象都直接或间接的使用Object对象的原型. 当访问某对象的属性或方法时, 如果对象本身没有这个属性或方法, 那么Javascript会检查该对象的prototype(原型)对象是否拥有这个属性或方法, 如果有, 则作为对象的属性或方法返回, 如果没有, 那么将通过原型对象的prototype属性继续到父类的原型对象上进行检查, 直到原型对象为Object函数的原型对象为止. 例如: 当访问Student类的对象实例Jane时, 如果jane对象上的没有相关方法, 则会通过jane对象上的prototype属性找到其原型对象(即Student函数的原型对象), 并在其原型对象上查找相关方法. 这里有必要提醒的是: 由于继承关系的存在, jane的prototype属性所指向的原型对象实际上是父类函数的对象实例, 因为当我们通过Student函数创建一个对象jane后, jane的prototype属性指向的是Student函数的原型, 此时根本没继承关系存在. 在Javascript中, 继承关系的实现类似于C#中的继承关系(参考博客里的对象创建过程图), 子类对象之所以能够访问父类对象的成员是因为子类对象中包含一个父类的对象. 在Javascript中, 继承也是如此, 为了实现继承关系, jane对象的prototype属性指向的原型对象(也就是Student函数的原型对象)被一个父类函数(Person)创建的对象实例所替换, 此时jane的原型对象就是Person对象. 而且jane的原型对象(Person对象)上一样会有Person类的属性成员(如: name、age等), 只不过name、age成员对实现继承关系没有影响, 况且继承关系也没有用到name、age成员, 可以认为这种属性是冗余的废属性. 但是关键的是Person对象上除name、age之外的prototype属性, 因为Person对象是通过Person类函数创建的, 所以其原型也一定指向Person函数的原型, 这样我们就可以通过Person对象的prototype属性获得Person函数的原型对象的引用, 从而使jane对象能够找到Person函数的原型对象, 也就是Student函数的父类函数的原型对象, 即: jane对象找到Person对象(jane的原型对象), 在通过Person对象的prototype属性找到父类函数的原型对象, 这样便实现了继承关系. 而Person对象也是类似的情况, 最终通过一层一层的查找, 最终查找到Object函数的原型对象后, 就认为到头了, 于是认为jane对象没有相关方法. 这种方式, 通常也形象的成为”原型链??. 另外, 还有个情况需要引起注意, 就是当查找到某一级的原型对象时, 发现找到了相关方法, 则会终止查找, 直接返回相关方法; 如果该级的上级原型对象仍然有同名的相关方法, 这时也不在查找, 类似于C#中子类方法对父类方法的覆盖. ? 4. prototype是一个特殊的属性, 在大多数的浏览器上(如:IE), 都不能直接访问对象的prototype成员, 返回的结果为undefined, 少数浏览器可以访问(如: firefox). 函

文档评论(0)

qwd513620855 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档