工作经验JS之原型式的继承

来源:博客园【JoeJoan】 2019-01-20 14:58:01
创建一个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的所有成员,同时也包括:

一个新的属性,subject——这个属性包含了教师教授的学科。
一个被更新的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()的prototype的constructor属性指向的是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;
}
继承width和height属性


function BlueGlassBrick() {
  Brick.call(this);

  this.opacity = 0.5;
  this.color = 'blue';
}

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

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

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

3、对象在您打算把一个数据集合从一个地方传递到另一个地方的时候非常有用。这些都可以在不使用构造器和继承的情况下完成。如果您只是需要一个单一的对象实例,也许使用对象常量会好些,您当然不需要使用继承。
原文出处:https://www.cnblogs.com/Joe-and-Joan/p/10280897.html
关注我们:请关注一下我们的微信公众号:扫描二维码,公众号:aiboke112
版权声明:本文来源地址若非本站均为转载,若侵害到您的权利,请及时联系我们,我们会在第一时间进行处理。