- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第4章 继承 继承在JS中是一个非常复杂的课题,其困难程度远远超过了其他OO语言。不像在其他OO语言中用一个简单的关键字就可以继承一个类,JS需要一系列的步骤来使公共成员得以继承。使问题变得进一步复杂的是,JS是少数使用原型来继承(稍后会它的优势)的语言之一。当然,由于JS的灵活性,你可以选择使用标准的基于类的继承,或者稍微有些棘手的原型继承。 在本章中,我们来看下JS中创建子类的方法,以及适用它们的不同情况。 为什么要使用继承 在我们涉及任何代码之前,我们需要知道使用继承有什么好处。一般来讲,你希望你设计的类可以减少大量重复的代码并且尽可能保持对象之间的松耦合。继承可以帮助你实现这两个概念中的第一个,并且可以让你在现有的类的基础上补充它的方法。他也允许你很容易的修改。如果你有几个类都需要一个toString方法用特定方法来做结构输出,你需要拷贝并且粘贴方法给每一个类。但当你每次修改这个方法时,你必需要为每个类修改。但如果你创建了一个ToStringProvider类,并且让这些类继承了它,那么其方法的代码仅需修改一次。 让一个类继承另一个类有一种可能性,你使他们之间的耦合增强。就是说,一个类依靠内部实现了另外一个类。我们来看下一些避免这种情况的方法,包括使用掺元类mixin classes)来世像其他类提供方法。 标准继承 JS可以像标准继承语言一样。通过使用函数声明类,并用new关键字来创建实例,对象的行为也和Java或C++中的类非常类似。这实在JS中一个非常基本的类声明。 /* Class Person. */ function Person(name) { = name; } Ptotype.getName = function() { return ; } 首先创建构造体,按照惯例,类名称要使用了一个大写字母开头。在构造体中,使用this关键字来创建实例的属性。要创建方法,就把方法添加到类的prototype对象中,例如Ptotype.getName。要创建实例,只需要用new关键字调用构造体函数即可。 var reader = new Person(John Smith); reader.getName(); 然后你就可以访问实例所有的属性和方法了,这是JS中非常简单的一类的例子 原型链 要创建一个类来继承Person就稍微有些复杂了: /* Class Author. */ function Author(name, books) { Person.call(this, name); // Call the superclasss constructor in the scope of this. this.books = books; // Add an attribute to Author. } Atotype = new Person(); // Set up the prototype chain. Atotype.constructor = Author; // Set the constructor attribute to Author. Atotype.getBooks = function() { // Add amethod to Author. return this.books; }; 建立一个类去继承另外一个类需要多行代码(并不像大多数OO语言那样紧紧使用一个extend关键字就可以),首先,像前面的例子一样创建一个构造体函数。在这个构造体中,调用父类的构造体,并传递name参数给它。这一行应该多解释下。当你使用new操作符时,发生了相应的事情。首先一个空的对象被创建,然后构造体在在作用域链之前被这个空对象调用;this在每个构造体函数中指向空对象。所以要在Author调用父类的构造体,你必须要做类似的事情。Person.call(this,name)在将name作为一个参数时,通过空对象(本例中为this)在作用域链头部调用Person的构造体函数。 接下来是创建原形链。尽管事实上实现它的代码很简单,但是它却是一个非常复杂的问题。在前面提过,JS没有extend关键字,但是,每个对象都有一个称之为prototype的属性,这个属性为另外一个对象或者为null。当对象的一个成员被访问时(例如reader.getName),如果当权对象中没有这个成员,JS就会寻找这个成员是否在对象的prototype对象中。如果在那也没有找到,它就顺着原型链,访问每一个对象的prototype直到这个成员被找到(或prototype为null)这意味着为了使一个类继承其他的类,你必须要让这个子类的prototype属性指向其父类的实例。最后一步是设置const
文档评论(0)