如下概念请花费必定的时间完全理解,才能进行下一步,思考题必定要思考,这样才能完全掌握原型链的知识点,教程中若是有任何的错误不足请指正!编程
由function创造出来的函数,好比:数组
function a(){}; var b=function(){};
系统内置的函数对象ide
Function,Object,Array,String,Number
只有函数对象才有 prototype属性 ,重要的事情说三遍!函数
思考: js的引用数据类型都属于函数对象吗?prototype
除开函数对象以外的对象都是普通对象设计
var b='qwe'; // b 是字符串类型,属于普通对象 var c=123;; // c 是数字类型,属于普通对象
思考:js有五种基本类型:Undefined,Null,Boolean,Number和String,他们都是属于普通对象吗?指针
prototype属性也叫原型对象,主要是为了实现继承和共享属性;code
能够说咱们的每一次编程,内在都有原型对象来发挥着做用,若是你没有掌握原型对象的含义,那么你的js尚未真正的入门!对象
function a(){};
首先对象 a 是由Function创造出来,是函数对象;那么根据咱们以上的教程,a 就有了prototype属性,那么这个原型对象是怎么创造出来的呢?
来看下面这个例子:继承
var temp = new a(); a.prototype=new Object(); a.prototype = temp;
那么a的prototype属性就是这样创造出来的;
思考:原型对象prototype 属于函数对象吗?
JavaScript中,万物皆对象!全部的对象obj都具备proto属性(null和undefined除外),可称为隐式原型,一个对象的隐式原型指向构造该对象的构造函数的原型
请看如下例子帮助理解:
function a(){}; var obj=new a(); console.log(a.__proto__===Function.prototype); //true console.log(a.prototype.__proto__===Object.prototype); //true console.log(obj.__proto__===a.prototype); //true
思考一下,var obj={}; obj.prototype.proto指向谁?
假设 obj 是由函数对象 a 由new运算创造出来的,那么obj的constructor 的属性就存放着一个对 a 的引用,经过这个构造函数,咱们还能够为 a添加其余属性和方法,
这个属性的最初设计是为了检测对象的数据类型,不事后来人们经过此属性的特性作了更多的事情
请看如下例子:
function a(){}; var obj=new a(); obj.constructor.b=`我是a的新的属性`; console.log(a.b); //我是a的新的属性 console.log(a.constructor===Function); //true console.log(a.prototype.constructor===a); //true console.log(obj.constructor===a); //true
函数a是由Function创造出来,那么它的constructor指向的Function,obj是由new a()方式创造出来,那么obj.constructor理应指向a
思考:a.prototype.proto.constructor指向谁?
思考: js的引用数据类型都属于函数对象吗?
引用类型值:指的是那些保存在堆内存中的对象,意思是,变量中保存的实际上只是一个指针,这个指针执行内存中的另外一个位置,由该位置保存对象
那么数组,普通对象,函数对象都算是引用数据类型,引用数据类型范围包含函数对象的范围
思考:js有五种基本类型:Undefined,Null,Boolean,Number和String,他们都是属于普通对象吗?
基本类型值:指的是保存在栈内存中的简单数据段;除开函数对象以外的对象都是普通对象,那么普通对象范围是包含基本数据类型的
事实上(函数对象,普通对象)以及(基本数据类型,引用数据类型)是在不一样角度对js变量进行的定义
思考:原型对象prototype 属于函数对象吗?
事实上 这个问题要进行分别回答:
Function.prototype 属于函数对象,其余对象的prototype属于普通对象
function a(){}; console.log(typeof Function.prototype); // function console.log(typeof a.prototype); //object
前面说过prototype的创造过程
var temp = new a(); a.prototype = temp;
这里temp固然就是普通对象啦,可是看下Function的prototype创造过程
var a = new Function(); Function.prototype = a;
看明白了把,Function的prototype为何是函数对象了吧?回忆一下函数对象的定义吧!
思考一下,var obj={}; obj.prototype.proto指向谁?
这里分步思考:
1, obj只是一个普通对象
2, 什么类型的对象是有prototype属性的?固然是函数对象
3, 因此obj是没有prototype属性的
4, 因此obj.prototype===undefined
5, 因此此题的最终问题是:undefined.proto指向什么
6, 全部的对象obj都具备proto属性(null和undefined除外)!因此答案是 js报错(有没有一种被我坑了的感受)
思考:a.prototype.proto.constructor指向谁?
function a(){};
这里继续分解题目:
1, a.prototype指向a的一个实例,咱们已经屡次强调了,并且属于普通对象
2, proto定义为:指向创造obj对象的函数对象的prototype属性,因此看下谁创造了a.prototype,由于a.prototype是普通对象,类型为object,那么是Object创造了它,
3, 那么显而易见a.prototype.proto指向了Object.prototype
4, 那么题目简化为Object.prototype.constructor指向谁
5, 继续分解题目,Object.prototype为基本对象,那么就是Object创造了它,那么它的constructor就指向了Object
Object.prototype.constructor===Object //true
不知道你晕不晕,我有点晕,这产生了蛋生鸡仍是鸡生蛋的问题啦~
放心,仍是有尽头的 :
Object.prototype.__proto__===null //true
这个例子告诉咱们是 是null创造了一切““这不就是易经中的:道生一,一辈子二,二生三,三生万物!