先來個簡單的代碼:typescript
function Info(name, age){
this.name = name;
this.age = age;
this.message = function () {
console.log(this.name + "is" + this.age + "year's old");
}
}
var lynn = new Info("Lynn", 20);
構造函數的首字母通常大寫,用來區分於普通函數,使用 new 調用,沒有返回值,獲得的對象成爲該函數的一個實例。
構造函數的prototype屬性,稱爲原型屬性,是一個隱藏屬性,指向一個是object類型,稱爲原型對象。
構造函數原型對象的 constructor 屬性 始終指向構造函數自己。 fn.prototype.constructor === fn;
當一個函數被用做構造函數來建立實例時,該函數的prototype屬性值將被做爲原型賦值給全部對象實例(也就是設置實例的proto屬性),也就是說,全部實例的原型引用的是函數的prototype屬性。
lynn.proto ===Info.prototype函數
在構造函數的原型上面附加的屬性或者方法, 能夠被其全部的實例共用.性能
當代碼獲取某個對象的屬性時,首先會在對象實例自己內查找,若是查找不到,就會向上搜索其原型對象。爲實例添加一個屬性時,這個屬性會屏蔽原型對象中的 同名屬性。若想訪問原型對象中的屬性值,須要使用delete將這個同名屬性在實例中完全刪除。(注意:使用delete刪除構造函數中的屬性將把實例的原型對象中的屬性也刪除即若是把name放在Person()中,使用delete,person2的name將不存在)ui
function Info() {};
Person.prototype.name = 'Lily';
Person.prototype.age = 18;
var info1 = new Info();
var info2 = new Info();
info2.name = "Tom";
console.log(info1.name);// Lily
console.log(info2.name); // Tom
delete.info2.name;
console.log(info2.name); // Lilythis
一個屬性可以訪問時(不管是在實例仍是原型對象中)in操做符都會返回true,因此當in操做符返回true。hasOwnProperty("屬性名")能夠檢測一個屬性是存在於實例仍是原型對象中,其返回值true表明存在於實例中,false表明存在於原型對象中。spa
原型對象自己一樣擁有一個內部屬性 [[prototype]], 指向當前構造函數的構造函數的原型對象.
這種由原型對象構建而成的鏈表, 就是原型鏈.
原型鏈存在的意義, 在於儘量的共用方法和屬性. 或者其餘更多的我不知道的意義.
prototype
在JavaScript語言中,全部對象的原型鏈根節點都是Object.prototype。Object.prototype值是沒法修改,它提供了一些默認的方法。且它的proto等於null!code
instanceof是一個二元運算符,如:A instanceof B. 其中,A必須是一個合法的JavaScript對象,B必須是一個合法的JavaScript函數 (function). 判斷過程以下:對象
若是函數B在對象A的原型鏈 (prototype chain) 中被發現,那麼instanceof操做符將返回true,不然返回false.ip
因此致使了:
Function instanceof Object; //true Object instanceof Function; //true Function instanceof Function; //true Object instanceof Object; //true
這樣的狀況發生!