乐趣区

从Array到Null

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.prototype
a2.__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 的构造函数为 Array

Array.__proto__.constructor // ƒ Function() { [native code] }
Array.__proto__.constructor === Function
// Array 的构造函数为 Function

Function.__proto__.constructor // ƒ Function() { [native code] }
Function.__proto__.constructor === Function
// Function 的构造函数为 Function

Function.prototype.__proto__.constructor
Function.prototype.__proto__.constructor === Object
// ƒ Object() { [native code] }
// Function

Object.prototype.__proto__.constructor 
// Cannot read property 'constructor' of null
Object.prototype.__proto__ === null
退出移动版