创建一个Person的构造器

function Person(first, last, age, gender, interests) {
this.name = {
first,
last
};
this.age = age;
this.gender = gender;
this.interests = interests;
};

方法定义在构造器的原型上

Person.prototype.greeting = function() {
alert('Hi! I\'m ' + this.name.first + '.');
};

任务:

创建一个Teacher类,就像我们前面在面向对象概念解释时用的那个一样。这个类会继承Person的所有成员,同时也包括:

  1. 一个新的属性,subject——这个属性包含了教师教授的学科。
  2. 一个被更新的greeting()方法,这个方法打招呼听起来比一般的greeting()方法更正式一点——对于一个教授一些学生的老师来说。

定义一个Teacher的构造器函数

function Teacher(first, last, age, gender, interests, subject) {
Person.call(this, first, last, age, gender, interests); this.subject = subject;
}

call()函数:基本上,这个函数允许您调用一个在这个文件里别处定义的函数。第一个参数指明了在您运行这个函数时想对“this”指定的值,也就是说,您可以重新指定您调用的函数里所有“this”指向的对象。其他的变量指明了所有目标函数运行时接受的参数。

最后一行代码简单地定义了一个新的subject属性,这将是教师会有的,而一般人没有的属性。

创建一个和Person.prototype一样的新的原型属性值

(这个属性指向一个包括属性和方法的对象)

Teacher.prototype = Object.create(Person.prototype);

Teacher.prototype现在会继承Person.prototype的所有属性和方法。

Teacher()prototypeconstructor属性指向的是Person(), 我们需要改变一下指向

Teacher.prototype.constructor = Teacher;

每一个函数对象(Function)都有一个prototype属性,并且只有函数对象有prototype属性,因为prototype本身就是定义在Function对象下的属性。当我们输入类似var person1=new Person(...)来构造对象时,JavaScript实际上参考的是Person.prototype指向的对象来生成person1。另一方面,Person()函数是Person.prototype的构造函数,也就是说Person===Person.prototype.constructor

无参数继承

function Brick() {
this.width = 10;
this.height = 20;
}

继承widthheight属性

function BlueGlassBrick() {
Brick.call(this); this.opacity = 0.5;
this.color = 'blue';
}

仅传入了thiscall()中 - 不需要其他参数,因为我们不会继承通过参数设置的父级的任何属性。

总结:

1、随着您的代码量的增大,继承变得重要。如果您开始创建一系列拥有相似特性的对象时,那么创建一个包含所有共有功能的通用对象,然后在更特殊的对象类型中继承这些特性,将会变得更加方便有用。

2、在使用继承时,建议您不要使用过多层次的继承,并仔细追踪定义方法和属性的位置。很有可能您的代码会临时修改了浏览器内置对象的原型,但您不应该这么做,除非您有足够充分的理由。过多的继承会在调试代码时给您带来无尽的混乱和痛苦。

3、对象在您打算把一个数据集合从一个地方传递到另一个地方的时候非常有用。这些都可以在不使用构造器和继承的情况下完成。如果您只是需要一个单一的对象实例,也许使用对象常量会好些,您当然不需要使用继承。

最新文章

  1. addShutdownHook的用法
  2. Golang 交叉编译
  3. mybatis 批量插入和where条件使用
  4. asp.net mvc 下载文件 txt doc xsl 等等
  5. vue-cli的使用
  6. 设计模式のTemplatePattern(模板模式)----行为模式
  7. Go语言程序结构分析初探
  8. Centos7与Windows10添加Windows10启动项并设置为默认启动
  9. Exp7:网络欺诈防范
  10. 【刷题】BZOJ 1924 [Sdoi2010]所驼门王的宝藏
  11. 【cs229-Lecture7】支持向量机(SVM)
  12. Haskell语言学习笔记(44)Lens(2)
  13. java 和 C 代码运行效率的比较(整理)
  14. 【vijos1049】送给圣诞夜的礼品
  15. HDU 2159 FATE (dp)
  16. dva框架之redux相关
  17. windows下libcurl+openssl编译与使用配置
  18. codeforces 799C Fountains
  19. cms-最近更新
  20. CodeForces599D【数学】

热门文章

  1. Postman使用手册4——API test
  2. 谷歌支付服务端详细讲解(PHP)
  3. ubuntu16.04 能启动mysql服务
  4. 利用腾讯云为你的域名申请并配置免费SSL一年
  5. centos7 systemd 必知必会
  6. 海思hi35xx 开发学习(1):海思媒体处理平台架构
  7. for ++i i++
  8. Angular material mat-icon 资源参考_Images
  9. Oracle DMP
  10. Binder 驱动(三)