Js中constructor, prototype, __proto__ 详解

constructor属性(原型对象中包含这个属性,实例当中也同样会继承这个属性)
prototype属性(constructor.prototype原型对象)
__proto__属性(实例指向原型对象的指针)
constructor 属性
var arr=[1,2,3];console.log(arr.constructor); //输出 function Array(){}var a={};console.log(arr.constructor);//输出 function Object(){}var bool=false;console.log(bool.constructor);//输出 function Boolean(){}var name="hello";console.log(name.constructor);//输出 function String(){}var sayName=function(){}console.log(sayName.constrctor)// 输出 function Function(){}//接下来通过构造函数创建instancefunction A(){}var a=new A();console.log(a.constructor); //输出 function A(){}
prototype属性
//constructor : A//instance : afunction A(){}var a=new A();A.prototype.name="xl";A.prototype.sayName=function(){console.log(this.name);}console.log(a.name);// "xl"a.sayName();// "xl"//那么由constructor创建的instance会继承prototype上的属性和方法
constructor属性和prototype属性
function Person(name){this.name=name;}Person.prototype.sayName=function(){console.log(this.name);}var person=new Person("xl");console.log(person.constructor); //输出 function Person(){}console.log(Person.prototype.constructor);//输出 function Person(){}console.log(Person.constructor); //输出 function Function(){}
Person.prototype={sayName:function(){console.log(this.name);}}console.log(person.constructor==Person); //输出 false (这里为什么会输出false后面会讲)console.log(Person.constructor==Person); //输出 falseconsole.log(Person.prototype.constructor);// 输出 function Object(){}//这里为什么会输出function Object(){}//还记得之前说过constructor属性始终指向创建这个对象的构造函数吗?Person.prototype={sayName:function(){console.log(this.name);}}//这里实际上是对原型对象的重写:Person.prototype=new Object(){sayName:function(){console.log(this.name);}}//看到了吧。现在Person.prototype.constructor属性实际上是指向Object的。//那么我如何能将constructor属性再次指向Person呢?Person.prototype.constructor=Person;
function Person(name){this.name = name;}var personOne=new Person("xl");Person.prototype = {sayName: function(){console.log(this.name);}};var personTwo = new Person('XL');console.log(personOne.constructor == Person); //输出trueconsole.log(personTwo.constructor == Person); //输出false//大家可能会对这个地方产生疑惑?为何会第二个会输出false,personTwo不也是由Person创建的吗?这个地方应该要输出true啊?//这里就涉及到了js里面的原型继承//这个地方是因为person实例继承了Person.prototype原型对象的所有的方法和属性,包括constructor属性。当Person.prototype的constructor发生变化的时候,相应的person实例上的constructor属性也会发生变化。所以第二个会输出false;//当然第一个是输出true,因为改变构造函数的prototype属性是在personOne被创建出来之后。
__proto__和prototype属性
function Person(name){this.name=name;}Person.prototype.sayName=function(){console.log(this.name);}var person=new Person("xl");person.sayName(); //输出 "xl"//constructor : Person//instance : person//prototype : Person.prototype
为什么会继承原型对象的方法?
function Person(name){this.name=name;}Person.prototype.sayName=function(){console.log(this.name);}var personOne=new Person("a");var personTwo=new Person("b");personOne.sayName(); // 输出 "a"personTwo.sayName(); //输出 "b"console.log(personOne.__proto__==Person.prototype); // trueconsole.log(personTwo.__proto__==Person.prototype); // trueconsole.log(personOne.constructor==Person); //trueconsole.log(personTwo.constructor==Person); //trueconsole.log(Person.prototype.constructor==Person); //trueconsole.log(Person.constructor); //function Function(){}console.log(Person.__proto__.__proto__); // Object{}本文完~ 
评论

