原型&原型链【JavaScript基础面试题】

一张图理解原型链

在这里插入图片描述
在上图中,Parent() 是构造函数,p1是由 Parent() 创建的对象。

前置知识

任何函数都可以作为 构造函数。当该函数通过 new 关键字调用的时候,我们就称之为 构造函数

看下图例子:

var Parent = function(){

}
//定义一个函数,那它只是一个普通的函数,我们不能称它为构造函数

var instance = new Parent();
//这时这个Parent就不是普通的函数了,它现在是一个构造函数。因为通过new关键字调用了它
//创建了一个Parent构造函数的实例 instance

理解了上文之后,我们再来理解三个概念:__proto__prototypeconstructor

prototype属性

在这里插入图片描述
prototype 是函数特有的属性(有人可能有会疑问,函数为什么有属性?因为在JS中函数也是一个对象,所以它有属性。)。prototype设计的目的是为了实现继承

一句话概括prototype的作用:让某一个构造函数实例化的所有对象可以找到公共的方法和属性。

例如上图中的Parent()构造函数,我如果给它的prototype属性设置一个name。那么所有通过Parent()构造出来的实例,比如p1、p2,都会有name 属性。

Parent.prototype.name = "所有Parent的实例都可以读取到我";

let p1 = new Parent();
let p2 = new Parent();

p1.name //"所有Parent的实例都可以读取到我";
p2.name //"所有Parent的实例都可以读取到我";

你可能会有疑问,我并没有给p1、p2这两个对象设置 name 属性,为什么它会有 name 属性?请看下节 proto 讲解

proto属性

在这里插入图片描述
__proto__ 属性是对象特有的属性。它表示当前对象的原型对象是谁。

对象的__proto__ 属性就是它的构造函数的 prototype 属性。可以看如下代码,其中Parent是构造函数,p1 是由 parent() 实例化得到的对象。

p1.__proto__ === Parent.prototype; // true

所以我们可以解答刚刚的问题了:为什么我们可以调用很多我们没有定义的方法和属性?这些方法和属性是哪来的呢?

答案是,在原型链上找到的。当我们调用p1.toString()的时候,先在 p1 对象本身寻找,没有找到则通过p1.__proto__找到了原型对象Parent.prototype,也没有找到,又通过Parent.prototype.__proto__找到了上一层原型对象Object.prototype。在这一层找到了toString方法。于是 p1 可以调用该toString方法。

如果追问:Object.prototype上也没找到怎么办?那么继续寻找Object.prototype.__proto__。但是Object.prototype.__proto__ === null,所以最终会返回 null

constructor属性

constructor 是对象特有的属性。它表示当前对象的 构造函数。在刚刚的例子中,我们使用构造函数 Parent() 创建了实例对象 p1。因此 p1的constructor 就是 Parent()。可以 console.log() 试试。

console.log(p1.constructor); // ƒ Parent(){}

我们知道,JS中函数也是对象。那么函数是否也有constructor 属性?我们发现构造函数 Parent()也有constructor 属性。可以 console.log() 试试。

console.log(Parent.constructor); // ƒ Function() { [native code] }

如果继续追问:Function() 是否也有constructor 属性?可以 console.log() 试试。我们发现,Function函数的构造函数就是本身了。

console.log(Function.constructor); // ƒ Function() { [native code] }
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

codereasy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值