原型继承:子类

在这里插入图片描述

当在任何对象上调用任何属性时,JavaScript 引擎将首先在该对象中查找该属性(即该对象自己的、非继承的属性)。如果没有找到该属性,JavaScript 将查看该对象的原型。如果在对象原型中仍然找不到该属性,则 JavaScript 将在原型链上继续搜索。JavaScript 中的继承重点就是建立原型链

如果只继承原型呢?

假设我们希望一个 Child 对象从一个 Parent 对象继承。为什么不应该只设置 Child.prototype = Parent.prototype 呢?

对象是通过引用来传递的。这意味着,由于 Child.prototype 对象和 Parent.prototype 对象引用的是同一个对象,因此你对 Child 的原型所作的任何更改也会被应用于 Parent 的原型!我们可不希望子对象能够修改其父对象的属性!最重要的是,这样做不会创建原型链。

function GuineaPig (name) {
  this.name = name;
  this.isCute = true;
}

const waffle = new GuineaPig('Waffle');
// waffle.__proto__ 指向 GuineaPig.prototype

GuineaPig 的新实例被创建时,特殊属性 waffle.__proto__ 会被设置为 GuineaPig.prototype。这个秘密链接允许 GuineaPig 构造函数的实例访问 GuineaPig.prototype 的属性。请记住,你不应该在你编写的任何代码中使用 __proto__

Object.create()

我们可以借助一种方式来自己设置对象的原型:使用 Object.create()。而且最棒的是,这种方式既可以让我们管理继承,同时又不会改变原型!

Object.create() 会接受一个对象作为参数,并返回一个新的对象,其 __proto__ 属性会被设置为传递给它的参数。然后,你只需要将所返回的对象设置为子对象构造函数的原型即可。

const mammal = {
   vertebrate: true,
   earBones: 3
};

const rabbit = Object.create(mammal);

console.log(rabbit); //{}
console.log(rabbit.__proto__ === mammal); //true

这意味着,现在 rabbit 扩展了 mammal(即 rabbit 继承自 mammal),而且 rabbit 可以将 mammal 的属性当作自己的属性一样进行访问!

Object.create() 是在 JavaScript 中建立原型继承的一种实用方法。

JavaScript 中的继承重点就是建立原型链。这让我们可以子类化,也就是创建一个“子”对象,让它继承“父”对象的大部分或全部属性和方法。然后,我们可以分别实现任何子对象的独特属性和方法,同时仍然保留其父对象的数据和功能。

继承和原型链
Object.create()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值