js原型链
0
JavaScript    2021-10-25 21:09:36    10    0

js的类型系统

从大的分类来说, js的值分为:

  • 原语类型(Primitives)
  • 对象类型(Object)

比如:

  1. var a = 1
  2. var b = 'abc'

他们是原语类型的值.

而:

  1. var c = {user: 'aaa'}
  2. var d = [1, 2, 3]
  3. var e = function() {...}
  4. var f = (a) => (b) => a + b

他们是对象类型的值.

更细的说:

  • c是对象类型的值
  • d是数组类型的值
  • e, f是函数类型的值

对象类型是一种基础的分类, 函数类型, 数组类型都属于对象类型.

有一点容易混淆的, 例如:

  1. var g = new String('abc')

这个值并不是原语类型的值, 而是对象类型的值.

总之, 如果typeof <值>得到的是object, 那么这个值就是对象类型的值, 否则就是原语类型的值.

值上的属性

  • 任何对象类型的值都有属性constructor.
  • 任何对象类型的值都有属性__proto__.
  • 任何函数类型的值都有属性prototype.

因为函数类型是对象类型的特例.
所以, 除了除了原语类型的值, 任何值都会有constructor__proto__,
函数类型的值还会有prototype.

构造

当定义一个函数,例如:function fun(){}时, 会发生两件事:

1. 意味着定义了一个新的类型

这样会定义一种新的类型: fun, 类型fun是函数类型的特例.

使用new fun()就可以创建fun类型的值:

  1. var f = new fun()

此时我们说值f(或函数f), 首先是对象类型的值, 其次是函数类型的值, 再次是fun类型的值.

2. 意味着定义了一个值

这样会定义一个值, 这个值的实际内容是{}, 可以通过fun.prototype访问这个值.

赋值规律

考虑这两行代码:

  1. function fun() { }
  2. var obj = new fun()

他的图如下:

title

总结规律:

对于constructor:

  • 一般对象(obj)的cons