Array

问题1:isArray、from、of等方法前面不写prototype?

let a1 = [1, 2, 3]console.dir(a1)// 定义一个数组a1,并打印a1// 确实没有isArray等方法

问题2:a1既然是由构造函数Array()构造的实例,为什么没有继承Array的方法?

// 静态方法// 只能通过 类/构造函数 本身调用// 不能通过 实例 调用class Array1 {  static isArray() {  // ES6定义静态方法    console.log('我是isArray方法')  }  map() {    console.log('我是map方法')  }}Array1.forEach = function() {  // ES6之前定义静态方法  console.log('我是forEach方法')}let a1 = new Array1()console.log('实例a1', a1)// a1.isArray()// 报错: a1.isArray is not a function

再回头看 问题1

// 方法的调用方式let a2 = [1, 2, 3]a2.push(4)Array.isArray(a2)// 构造函数prototype 里的方法会被继承到实例里面// Array的prototype 里的方法会被继承到实例a2里面a2.__proto__ === Array.prototypea2.__proto__.constructor === Array// 1、构造函数为Array// 2、原型对象为Array.prototype, 所有由Array生成的实例都会继承里面的方法// 3、a2.__proto__ 指向原型对象// 4、a2._proto__.constructor指向构造函数

Null

a2.__proto__.constructor // ƒ Array() { [native code] }a2.__proto__.constructor === Array// a2的构造函数为ArrayArray.__proto__.constructor // ƒ Function() { [native code] }Array.__proto__.constructor === Function// Array的构造函数为FunctionFunction.__proto__.constructor // ƒ Function() { [native code] }Function.__proto__.constructor === Function// Function的构造函数为FunctionFunction.prototype.__proto__.constructorFunction.prototype.__proto__.constructor === Object// ƒ Object() { [native code] }// FunctionObject.prototype.__proto__.constructor // Cannot read property 'constructor' of nullObject.prototype.__proto__ === null