欢迎光临散文网 会员登陆 & 注册

对象继承的方式

2023-09-05 15:13 作者:bengdour  | 我要投稿

这篇是上一篇的姐妹篇,面试中你有被问到-javascript中有几种创建对象的方式吗?这两篇结合起来,能更好地理解对象。开始吧!



01

原型链


原理:将父类的实例赋给子类的prototype

缺点:

实例的类型是不能直观看到的;

在创建子类型时,虽然可以传参,但容易造成修改的混乱。



02

构造函数结合原型链


原理:

使用call继承构造函数的属性和方法;

将父类的实例赋给子类的prototype继承父类的属性和方法,以及构造函数原型的方法

缺点:

由于调用了两次父类的构造函数,所以子类的原型中多了很多多余的属性



03

原型式继承



Object.getPrototypeOf()方法可以用来从子类上获取父类,判断一个类是否继承了另一个类

Object.setPrototypeOf(),为现有对象设置原型,返回一个新对象: 

接收两个参数:第一个是现有对象,第二是原型对象。


缺点:

不能传参,即使传参也会被忽略



04

寄生式继承


原理:利用Object.create()将父类复制给子类,子类再进行拓展

缺点:

使用不方便



05

寄生式组合继承


原理:

利用call()获取父类的属性和方法,并将指针指向子类

利用Object.defineProperty获取Person.prototype中的属性和方法

Object.defineProperty方法直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象。 

Object.defineProperty 需要三个参数(object , propName , descriptor)

 1 object 对象 => 给谁加

 2 propName 属性名 => 要加的属性的名字 【类型:String】

 3 descriptor 属性描述 => 加的这个属性有什么样的特性【类型:Object】


06

    extends关键字实现继承

super作为函数调用时,代表父类的构造函数--ES6要求,子类的构造函数必须执行一次super函数,否则会报错;

super虽然代表了父类Person的构造函数,但返回的是子类Coder的实例,即super内部的this指向的是Coder的实例。因此super()在这里相当于Person.prototype.contructor.call(this)






对象继承的方式的评论 (共 条)

分享到微博请遵守国家法律