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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。