原型和原型鏈
任何函數都可以作為構造函數。當該函數通過 new 關鍵字調用的時候,就稱之為構造函數。
var Parent = function(){}//定義一個函數,那它只是一個普通的函數,不能稱它為構造函數var instance = new Parent();
//這時這個Parent就不是普通的函數了,它現在是一個構造函數。因為通過new關鍵字調用了它
//創建了一個Parent構造函數的實例 instance
prototype 是 函數 特有的屬性
概括prototype的作用: 讓某一個構造函數實例化的 所有對象 可以找到公共的方法和屬性。
?
var Parent = function(){}
Parent.prototype.name="所有Parent的實例都可以讀取到我"
let p1 = new Parent();
let p2 = new Parent();
p1.name="所有Parent的實例都可以讀取到我"
p1.name //"所有Parent的實例都可以讀取到我"
p2.name //"所有Parent的實例都可以讀取到我"
p1._proto_ === Parent.prototype;// true
_proto_ 屬性是?對象 特有的屬性。它表示當前對象的原型 proto 對象是誰。
?總結:每個對象都有一個原型(prototype),并從原型上繼承屬性和方法。原型本身也是一個對象,它也有自己的原型,形成一個鏈式結構。這種鏈式結構就被稱為原型鏈。
constructor屬性
constructor 是對象特有的屬性。它表示當前對象的 構造函數。在剛剛的例子中,我們使用構造函數Parent()創建了實例對象 p1。因此 p1的 constructor 就是 Parent()。可以 console.log()試試
console.log(p1.constructor);// f Parent(){}
JS中函數也是對象。那么函數是否也有constructor 屬性?我們發現構造函數 Parent()也有 constructor 屬性。可以 console.log() 試試。
console.log(Parent.constructor);//f Function(){ [native code]}
如果繼續追問: Function()是否也有 constructor 屬性?可以 console.og()試試。我們發現Function函數的構造函數就是本身了。
console.log(Function.constructor);//f Function(){ [native code]}