乐趣区

关于前端:彻底深刻理解js原型链之prototypeproto以及constructor一

前言

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

函数对象

由 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); //true
console.log(a.prototype.__proto__===Object.prototype); //true
console.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); //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 为什么是函数对象了吧? 回顾一下函数对象的定义吧!

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

退出移动版