詳解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原型

相關文章
相關標籤/搜索