详解prototype、proto和constructor的关系

代码示例

function Foo() {};
var f1 = new Foo;

构造函数

用来初始化新建立的对象的函数是构造函数。上例中Foo()就是构造函数函数

实例对象

经过构造函数的new操做符建立的对象是实例对象。一个构造函数能够构造多个实例对象prototype

function Foo() {};
var f1 = new Foo;
var f2 = new Foo;
console.log(f1 === f2); //false

原型对象及prototype

构造函数有一个prototype属性,指向实例对象的原型对象。构造函数实例化的多个对象具备相同的原型对象,可用原型对象来实现继承code

function Foo() {};
Foo.prototype.a = 1;
var f1 = new Foo;
var f2 = new Foo;

console.log(Foo.prototype.a); //1
console.log(f1.a); //1
console.log(f2.a); //1

constructor

原型对象有一个constructor属性,指向该原型对象对应的构造函数对象

function Foo() {};
console.log(Foo.prototype.constructor === Foo) //true

因为实例对象可用继承原型对象的属性,因此实例对象也拥有constructor属性,一样指向原型对象对应的构造函数继承

function Foo() {};
var f1 = new Foo;
console.log(f1.constructor == Foo); //true

proto

实例对象有一个proto属性,指向该实例对象对应的原型对象ip

function Foo() {};
var f1 = new Foo;
console.log(f1.__proto__ === Foo.prototype); // true

总结

  1. 函数是new Function的结果,因此函数能够做为实例对象,其构造函数是Function(),原型对象是Function.prototype
  2. 对象是new Object的结果,因此对象能够做为实例对象,其构造函数是Object(),原型对象是Object.prototype
  3. Object.prototype的原型对象是null
  4. __proto__是实例对象的属性,指向其构造函数的prototype属性,即指向原型对象
  5. 原型对象有一个constructor属性,指向该原型对象对应的构造函数

Tips

typeof null === "Object"
缘由是在js中,不一样对象在底层都是以二进制标识,二进制前三位若是都是0的话就会被断定为Object类型,null的二进制都是0,因此返回Object原型

相关文章
相关标签/搜索