js 属性继承易错点

js世界中,原型继承是一个最普通的行为,但是这里面有一个易错点需要我们多加留意。

如下是创建了两个类Person, Student,我们分别在Person的构造函数和原型对象上设置了两个属性:country, gender。
随后定了一个Student类,其拥有自身属性age,同时继承了Person

first

function Person() {
  this.country = 'china'
}

Person.prototype.gender = 'man'

function Student() {
  this.age = 16
}

Student.prototype = new Person

const s = new Student

window.console.log(`s.age=${s.age},s.country=${s.country},s.gender=${s.gender}`); 

上面的console.log打印结果如下:

// s.age=16,s.country=china,s.gender=man

s实例拥有age,country,gender三个属性。

second

我们将person的原型对象属性country设置为japan

Person.prototype.country = 'japan'

我们将其打印

window.console.log(`s.age=${s.age},s.country=${s.country},s.gender=${s.gender}`);

得到的结果如下:

 // s.age=16,s.country=china,s.gender=man

我们看到country没有发生变化,并不等于japan

third

我们将Person的原型对象gender设置为girl

Person.prototype.gender = 'girl'

打印结果如下:

window.console.log(`s.age=${s.age},s.country=${s.country},s.gender=${s.gender}`); 
// s.age=16,s.country=china,s.gender=girl

结论

当Student继承Person实例后,其直接原型对象已经是实例,其祖父类才是Person的原型对象,所以当我们s.country时,其在实例p上已经寻找到了country,并不会去Person.prototype上寻找country,同理,s.gender发生了变化是因为在前两个对象没有找到gender属性,因此大家在用的时候,已定需要注意这一点

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  •   面向对象(Object-Oriented,OO)的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意...
    霜天晓阅读 2,172评论 0 6
  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,910评论 2 9
  • 博客内容:什么是面向对象为什么要面向对象面向对象编程的特性和原则理解对象属性创建对象继承 什么是面向对象 面向对象...
    _Dot912阅读 1,471评论 3 12
  • 要点: 函数式编程:注意不是“函数编程”,多了一个“式” 模块:如何使用模块 面向对象编程:面向对象的概念、属性、...
    victorsungo阅读 1,636评论 0 6
  • 继承 一、混入式继承 二、原型继承 利用原型中的成员可以被和其相关的对象共享这一特性,可以实现继承,这种实现继承的...
    magic_pill阅读 1,097评论 0 3