JavaScript类和继承:prototype属性

我们已经在第一章中使用prototype属性模拟类和继承的实现。 prototype属性本质上还是一个JavaScript对象。 并且每个函数都有一个默认的prototype属性。

公司主营业务:成都网站制作、成都网站建设、外贸营销网站建设、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。成都创新互联是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。成都创新互联推出两当免费做网站回馈大家。

如果这个函数被用在创建自定义对象的场景中,我们称这个函数为构造函数。 比如下面一个简单的场景:

 
 
 
  1. // 构造函数
  2. function Person(name) {
  3.     this.name = name;
  4. }
  5. // 定义Person的原型,原型中的属性可以被自定义对象引用
  6. Person.prototype = {
  7.     getName: function() {
  8.         return this.name;
  9.     }
  10. }
  11. var zhang = new Person("ZhangSan");
  12. console.log(zhang.getName());   // "ZhangSan"

作为类比,我们考虑下JavaScript中的数据类型 - 字符串(String)、数字(Number)、数组(Array)、对象(Object)、日期(Date)等。 我们有理由相信,在JavaScript内部这些类型都是作为构造函数来实现的,比如:

 
 
 
  1. // 定义数组的构造函数,作为JavaScript的一种预定义类型
  2. function Array() {
  3.     // ...
  4. }
  5. // 初始化数组的实例
  6. var arr1 = new Array(1, 56, 34, 12);
  7. // 但是,我们更倾向于如下的语法定义:
  8. var arr2 = [1, 56, 34, 12];

同时对数组操作的很多方法(比如concat、join、push)应该也是在prototype属性中定义的。

实际上,JavaScript所有的固有数据类型都具有只读的prototype属性(这是可以理解的:因为如果修改了这些类型的prototype属性,则哪些预定义的方法就消失了), 但是我们可以向其中添加自己的扩展方法。

 
 
 
  1. // 向JavaScript固有类型Array扩展一个获取最小值的方法
  2. Array.prototype.min = function() {
  3.     var min = this[0];
  4.     for (var i = 1; i <  this.length; i++) {
  5.         if (this[i] <  min) {
  6.             min = this[i];
  7.         }
  8.     }
  9.     return min;
  10. };
  11. // 在任意Array的实例上调用min方法
  12. console.log([1, 56, 34, 12].min());  // 1

注意:这里有一个陷阱,向Array的原型中添加扩展方法后,当使用for-in循环数组时,这个扩展方法也会被循环出来。

下面的代码说明这一点(假设已经向Array的原型中扩展了min方法):

 
 
 
  1. var arr = [1, 56, 34, 12];
  2. var total = 0;
  3. for (var i in arr) {
  4.     total += parseInt(arr[i], 10);
  5. }
  6. console.log(total);   // NaN

解决方法也很简单:

 
 
 
  1. var arr = [1, 56, 34, 12];
  2. var total = 0;
  3. for (var i in arr) {
  4.     if (arr.hasOwnProperty(i)) {
  5.         total += parseInt(arr[i], 10);
  6.     }
  7. }
  8. console.log(total);   // 103

分享标题:JavaScript类和继承:prototype属性
分享网址:http://www.shufengxianlan.com/qtweb/news48/256348.html

成都网站建设公司_创新互联,为您提供品牌网站设计软件开发网站收录企业建站Google微信小程序

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联