前言

以下概念请破费肯定的工夫彻底了解,能力进行下一步,思考题肯定要思考,这样能力彻底把握原型链的知识点,教程中如果有任何的谬误有余请斧正!

函数对象

由function发明进去的函数,比方:

    function a(){};    var b=function(){};    

零碎内置的函数对象

Function,Object,Array,String,Number

只有函数对象才有 prototype属性 ,重要的事件说三遍!

思考: js的援用数据类型都属于函数对象吗?

一般对象

除开函数对象之外的对象都是一般对象

var b='qwe'; // b 是字符串类型,属于一般对象var c=123;; // c 是数字类型,属于一般对象
思考:js有五种根本类型:Undefined,Null,Boolean,Number和String,他们都是属于一般对象吗?

原型对象

prototype属性也叫原型对象,次要是为了实现继承和共享属性;

能够说咱们的每一次编程,外在都有原型对象来施展着作用,如果你没有把握原型对象的含意,那么你的js还没有真正的入门!

function a(){};

首先对象 a 是由Function发明进去,是函数对象;那么依据咱们以上的教程,a 就有了prototype属性,那么这个原型对象是怎么发明进去的呢?
来看上面这个例子:

var temp = new a();a.prototype=new Object();a.prototype = temp;

那么a的prototype属性就是这样发明进去的;

思考:原型对象prototype 属于函数对象吗?

指针__proto__

JavaScript中,万物皆对象!所有的对象obj都具备proto属性(null和undefined除外),可称为隐式原型,一个对象的隐式原型指向结构该对象的构造函数的原型

请看以下例子帮忙了解:

function a(){};var obj=new a();console.log(a.__proto__===Function.prototype); //trueconsole.log(a.prototype.__proto__===Object.prototype); //trueconsole.log(obj.__proto__===a.prototype); //true
思考一下,var obj={}; obj.prototype.__proto__指向谁?

构造函数属性constructor

假如 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); //trueconsole.log(a.prototype.constructor===a); //trueconsole.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); // functionconsole.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为什么是函数对象了吧?回顾一下函数对象的定义吧!

指针__proto__思考题解答

思考一下,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报错(有没有一种被我坑了的感觉)

结构器constructor思考题解答

思考: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发明了所有““这不就是易经中的:道生一,毕生二,二生三,三生万物!