前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JS面试必问-JS原型及原型链

JS面试必问-JS原型及原型链

作者头像
用户10106350
发布2022-10-26 12:58:34
1.6K0
发布2022-10-26 12:58:34
举报
文章被收录于专栏:WflynnWeb

为什么需要原型

在js中万物皆对象,对象可以说是重中之重了。每一个对象都拥有自己的属性。但是在这个世界中有很多东西都是相似的,可以归为一类,他们有共同的方法和属性。不可能让每一个对象都定义一个属性吧。那样太消耗内存了。所以,在js中怎么才能让多个对象共享一个或多个方法呢?原型的出现就是为了解决这个问题。

什么是原型对象

声明一个构造函数

代码语言:javascript
复制
function students() {
    /* 我就是构造函数 */
}
代码语言:javascript
复制
在声明了一个函数之后,浏览器会自动按照一定的规则创建一个对象,这个对象就叫做原型对象。这个原型对象其实是储存在了内存当中。函数有一个prototype属性(只有函数才有prototype属性),这是一个指针,指向一个包含所有实例共享的属性和方法的对象,称之为原型对象。原型对象有一个constructor属性,默认指向对应的构造函数。

什么是原型链

根据字面意思我们可以这样理解,就是将原型连成一条链。我们上面讲过,js每一次获取对象中的属性都是一次查询过程,如果在自有属性中找不到就会去原型对象中查找,如果原型对象中还查不到,就回去原型对象的原型中查找,也就是按照原型链查找,直到查找到原型链的顶端,也就是Object的原型。会一直通过__proto__向上查找,也就是它构造函数的prototype中查找,这就是原型链,通过__proto__向上进行查找,最终到null结束,如果没有则返回undefined。

在js中,对象都有__proto__属性,一般这个是被称为隐式的原型,该隐式原型指向构造该对象的构造函数的原型。

代码语言:javascript
复制
function Person (name, age) {
    this.name = name
    this.age = age
}

代码语言:javascript
复制
Person.prototype.sex = '女' // 构造函数原型上的属性
var p1 = new Person('zxx', 18)
console.log(p1.sex) // 女

console.log(Person.prototype)
代码语言:javascript
复制
console.log(p1)

当输出p1.sex时,p1会先查找其自身有没有sex属性,当没有找到时,就会沿着原型链查找,即p1.__proto__.sex

p1.__proto__ === Person.prototype // 实例对象的隐式原型就是其构造函数的显式原型

注意点:

  • Object, Function, Array等等这些都被称作是构造“函数”,他们都是函数。而所有的函数都是构造函数Function的实例。从原型链机制的的角度来说,那就是说所有的函数都能通过原型链找到创建他们的Function构造函数的构造原型Function.protorype对象。
  • 因为Function.prototype是一个对象,所以他的构造函数是Object。从原型链机制的的角度来说,那就是说所有的函数都能通过原型链找到创建他们的Object构造函数的构造原型Object.prototype对象
  • Function是构造函数,所以它是函数对象
  • 函数对象都是由Function构造函数创建而来的,原型链机制解释为:函数对象的原型链中存在Function.prototype
  • 所有引用类型(函数,数组,对象)都拥有__proto__属性(隐式原型)
  • 所有函数拥有prototype属性(显式原型)(仅限函数)
  • 每个函数function都有一个prototype属性,默认指向一个空的Object对象(即称为:原型对象)函数的显示原型指向的对象默认是空Object实例对象(但Object不满足)
  • 所有函数都是Function实例(包括Fuction本身)
  • 对象的_proto_属性:创建对象时自动添加的,默认值为构造函数的prototype属性值
  • 函数的所有实例对象自动拥有原型中的属性(方法)
  • Object的原型对象是原型链尽头 Object.Prototype._proto_ // null

12.Storm实时数据分析平台

链接:https://pan.baidu.com/s/1A176hRxLB8lJvu_zMZQ0og

提取码:c28z

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 WflynnWeb 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是原型对象
  • 什么是原型链
  • 注意点:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档