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屬性,指向實例對象的原型對象。構造函數實例化的多個對象具備相同的原型對象,可用原型對象來實現繼承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屬性,指向該原型對象對應的構造函數對象
function Foo() {}; console.log(Foo.prototype.constructor === Foo) //true
因爲實例對象可用繼承原型對象的屬性,因此實例對象也擁有constructor屬性,一樣指向原型對象對應的構造函數繼承
function Foo() {}; var f1 = new Foo; console.log(f1.constructor == Foo); //true
實例對象有一個proto屬性,指向該實例對象對應的原型對象ip
function Foo() {}; var f1 = new Foo; console.log(f1.__proto__ === Foo.prototype); // true
typeof null === "Object"
緣由是在js中,不一樣對象在底層都是以二進制標識,二進制前三位若是都是0的話就會被斷定爲Object類型,null的二進制都是0,因此返回Object原型