关键词

原型, 原型对象, 构造函数

·
__proto__ , prototype, constructor ,

  1. prototype:每个函数都会有这个属性,这里强调,是函数,一般对象是没有这个属性的(这里为什么说一般对象呢,因为JS外面,所有皆为对象,所以这里的一般对象不包含函数对象)。它指向构造函数的原型对象;
  2. __proto __: 每个对象都有这个属性,这里强调,是对象,同样,因为函数也是对象,所以函数也有这个属性。它指向构造函数的原型对象;
  3. constructor : 这是原型对象上的一个指向构造函数的属性。
function Person(){}let p=new Person(); typeof p // object

p是Person的实例对象,Person是构造函数(个别是首字母大写),
构造函数Person有个属性prototype,指向其原型对象Person.prototype打印进去是{constructor: ƒ};
<font color="#0e88eb" size="4">实例对象p有个属性__proto__,指向p的构造函数的的原型对象 </font>

p.__proto__ ===Person.prototype; //true

constructor

<font color="#0e88eb" size="4"> 实例p的属性constructor,指向其构造函数</font>

p.constructor===Person;  //truePerson.constructor  //ƒ Function() { [native code] }

从下面代码看出Person的constructor 指向Function,所以构造函数Person是依据Function所创立进去的。

再看:

Object.constructor // 打印: ƒ Function() { [native code] }

是不是很惊奇

Function instanceof Object; // trueObject instanceof Function; // true

指向示例

    function Person() {           }    var p = new Person()    console.log(Person.prototype); // Object{}     console.log(p.prototype); // undifined    console.log(p.constructor); //function Person(){}       // 此处的p是通过 Person函数结构进去的,所以p的constructor属性指向Person    console.log(Person.constructor); //ƒ Object() { [native code] }    p.__proto__===Person.prototype; //true    p.constructor===Person;   //true  

延长:
之前提过,每个函数其实是通过new Function()结构的,每个对象都是通过new Object()结构的

    ({}).constructor; //打印进去是Object即是 ƒ Object() { [native code] }    ({}).constructor.constructor; //ƒ Function() { [native code] } 即Function  所以     Object.constructor===Function //true 数组也是     Array.constructor===Function  //true   .............  分割线     Object.__proto__===Object.constructor.prototype; //true   相当于     Object.__proto__===Function.prototype;    ............   分割线    Object.prototype=== Function.prototype.__proto__ ;  //true  咱们晓得    Object.prototype === ({}).__proto__  ;  //true  相当于   ({}).__proto__=== Function.prototype.__proto__;  //true  然而    {} === Function.prototype;  //false    Function.prototype;  //打印进去是ƒ () { [native code] }   

Object打印进去就是就是 ƒ Object() { [native code] }
Array打印进去就是 ƒ Array() { [native code] }
Function打印进去就是就是 ƒ Function() { [native code] }

<font color="#0e88eb">Object也是一个函数,它是Function()结构的; Function=> ƒObject() { [native code] </font>

Object既有__proto__属性,也有prototype属性

Object.__proto__===Function.prototype; //trueObject.prototype===({}).__proto__;  //true

上面理解下

function Person() {}var p = new Person()Person.prototype.constructor===Person  //truep.constructor===Person //truePerson.prototype===p //false

想深刻理解原型的请戳:https://blog.csdn.net/weixin_44989478/article/details/108471066
想理解作用和原型链的请戳*:https://www.cnblogs.com/unclekeith/p/5834289.html

k,本文到此结束。最初揭示,请看下自己的昵称