一、前言
本篇文章的目的是尽可能的解释清楚在js运行时的原型链。我准备从三个问题着手:
- 原型是什么?
- 原型链是什么?
- 原型链的应用?
二、什么是原型?
- 在编写javascript代码过程中,经常会用到
Array
、Object
、Function
等构造器创建对象。如下:const obj1 = { } const obj2 = new Object() console.log(obj1.toString) // [object Object] console.log(obj2.toString) // [object Object]
- 如上,在创建
obj1
时,我们并没有给它添加toString
方法。但是它却能够使用toString
方法。这是为什么呢?这是因为toString
方法是在Object
的原型上,而在创建obj1
时,会将Object
的原型挂载到obj1
的原型链上。Object
的原型是什么呢,可以通过浏览器控制台console.log(Object.prototype)
打印出来。如下:console.log(Object.prototype) console.log(typeof Object.prototype) // object console.log(Object.prototype === obj1.__proto__) // true // constructor: ƒ Object() // hasOwnProperty: ƒ hasOwnProperty() // toLocaleString: ƒ toLocaleString() // toString: ƒ toString() // ....
- 每一个构造方法都有一个
prototype
属性,它构造的每一个对象,都会有一个__proto__
属性,这个**__proto__
属性就是原型**。而且原型也只是一个普通的对象。在javascript中,每一个对象,都有自己的原型。万物皆对象,指的就是所有的数据类型,都有一个共同的原型,Object.prototype
。所以他们都是Object构造方法创建的。
三、什么是原型链
-
通过上面的例子,可以知道,所有的对象,都有一个共同的原型,那就是
Object.prototype
。但是,Object.prototype
的方法却不多,而在实际开发中,有很多方法都是Object.prototype
中没有,本身也没声明,但是却可以用的,比如:const arr = [] arr.splice(0, 1, 1) console.log(