原型链
本文将从将从什么是原型链,原型链的主要作用,以及函数和对象之间的关系,继承来说。
什么是原型链?
实例对象和原型对象之间形成的链式结构。
原型的主要作用是什么?
数据共享,实现继承
函数和对象的神秘之处
- 函数属于对象
function fn(){ console.log(123); } console.log(fn instanceof Object);
+ 上面的代码结果是true。可以证明函数是对象的一种。我们经常又说对象都是函数创建的,在这我来做个解释,这俩句话并不冲突。我们创建对象的时候可以通过构造函数实例化,new Object(),new Array()等方式。
对象是由函数创建出来的
```
//var obj = { a: 10, b: 20 };
//var arr = [5, 'x', true];var obj = new Object(); obj.a = 10; obj.b = 20; var arr = new Array(); arr[0] = 5; arr[1] = 'x'; arr[2] = true;
+ 而Object和Array又是函数
console.log(typeof (Object)); // function
console.log(typeof (Array)); // function
```既证明了函数是对象,又证明了对象是函数创建出来的,下面来深入理解下原型。
原型prototype
- 所有的函数都是Function的实例对象,在构造函数上都有一个原型属性prototype,该属性也是一个对象,此对象上有construction属性指向原型所属的构造函数,还有__proto__属性。此外,每个实例对象上也都有proto属性,指向构造函数的原型,这个属性只在浏览器内部使用。
- 实例对象的__proto__===构造函数的prototype。
- obj.__proto__===Object.prototype ---(特别的)
- Function.__proto__===Function.prototype ---(特别的)
- Function是一个函数,函数也是一种对象,也有__proto__属性,函数又都是被Function创建的,即Function是被自身创建的,他的__proto__指向了自身的prototype。
补充:instanceof(用于判断一个变量是否某个对象的实例).判断规则(A instanceof B),顺着A的__proto__属性这条线找,同时沿着B的prototype的这条线找,如果能找到同一个引用,返回true,即是这个对象的实例。
继承
- instanceof表示的就是一种继承关系,或者是说原型链的结构,所有的对象的原型链都会找到Object.prototype,所以所有的对象都会有Object.prototype的方法,这就是所谓的继承。
来源:https://www.cnblogs.com/lml-lml/p/7096299.html