js的基本了解

112 阅读1分钟

js的基本了解

js中的数据类型

字符串 数字 布尔 undefind null 大整数 符号 对象

string number boolean undefind null bignit symbol object

原型链

原型链涉及的概念比较多,简单举例说明

假设我们有一个普通对象 x={},这个 x 会有一个隐藏属性,叫做 __proto__ ,这个属性会指向 Object.prototype ,即

x.__proto__ === Object.prototype // 原型

此时,我们说 x 的原型 是 Object.prototype,或者说 Object.prototype 是 x 的原型。

而这个 __proto__ 属性的唯一作用就是用来指向 x 的原型的。

如果没有 __proto__ 属性,x 就不知道自己的原型是谁了。

然后再来说说我的了解原型链

假设我们有一个数组对象 a=[] ,这个 a 也会有一个隐藏属性,叫做 __proto__ ,这个属性会指向 Array.prototype ,即

a.__proto__ === Array.prototype

此时,我们说 a 的原型是 Array.prototype,跟上面的 x 一样。但又有一点不一样,那就是 Array.prototype 也有一个隐藏属性 __proto__ ,指向 Object.prototype ,即

// 用 x 表示 Array.prototype
x.__proto__ === Object.prototype

这样一来,a 就有两层原型:

  1. a 的原型是 Array.prototype
  2. a 的原型的原型是 Object.prototype

于是就通过隐藏属性 __proto__ 形成了一个链条:

a ===> Array.prototype ===> Object.prototype 

这就是原型链。

怎么做的呢

// 第一种
const x = Object.create(原型)

//第二种
const x = new 构造函数() // 会导致 x.__proto__ === 构造函数.prototype

解决了什么问题

在没有 Class 的情况下实现「继承」。以 a ===> Array.prototype ===> Object.prototype 为例,我们说:

  1. a 是 Array 的实例,a 拥有 Array.prototype 里的属性

  2. Array 继承了 Object(注意专业术语的使用)

  3. a 是 Object 的间接实例,a 拥有 Object.prototype 里的属性

这样一来,a 就既拥有 Array.prototype 里的属性,又拥有 Object.prototype 里的属性。

优点:简单,优雅

缺点:跟classs相比,不支持私有属性