對象:
1,函數對象:由function創造出來的函數
2,普通對象:除開函數對象以外的對象,都是普通對象
**即普通對象obj是構造函數Object的一個實例,所以:
obj.__proto__ === Object.prototype**函數
//普通對象 var obj = {} var obj1 = new Object() console.log(obj.__proto__ === obj1.__proto__); //true console.log(obj.__proto__ === Object.prototype); //true
但凡經過new Function()建立 的對象都是函數對象,其餘都是普通對象this
**注意: 全部對象都有__proto__屬性,只有函數對象纔有prototype屬性**prototype
3,原型對象:prototype屬性也叫原型對象,主要爲了實現繼承翻譯
**指針__proto__: js中,萬物皆對象!全部obj都具備proto屬性(null和undefined除外),並且指向創造obj對象的函數對象(生成實例的構造函數)的prototype屬性:**指針
function Person(name) { this.name = name; } function Mother() { } Mother.prototype = { //Mother的原型 age: 18, home: ['家裏蹲'] } Person.prototype = new Mother() //Person的原型爲Mother
Person 構造函數的原型對象 是 Mother ()。至關於原型(prototype)
是媽媽,Person如今是兒子。code
let a = new Person() let b = new Person('豬腦袋子') console.log(a.age); // 18 console.log(b.name, b.home); //豬腦袋子 ["家裏蹲"] console.log(a.__proto__); //__proto__: age: 18 home: Array(1) 0: "家裏蹲"length: 1
**在a和b的實例中,__proto__屬性,指向的都是它們的構造函數Person對象的prototype屬性,所對應的對象也就是Mother()**對象
**一個構造函數對象的原型(prototype)
,就至關於他媽,這個構造函數對象的實例,就至關於他媽不一樣的孩子
,而每一個實例中的__proto__屬性,就指向它們共同的媽媽!也就是構造函數對象的prototype屬性**繼承
****當咱們輸入 b.name 的時候,原型鏈的搜索機制是先在實例中搜索相應的值
,找不到就經過它__proto__指針,在原型中找
,還找不到就再往上一級原型中搜索……一直到了原型鏈的終點
(就是js自帶的Object,它的原型比較特殊,爲null ),就是到null還沒找到的話,就返回一個 undefined。****原型鏈
構造器constructor : 每個對象中的constructor 屬性返回建立此對象的函數對象的引用;例如:原型
function Cat(name,color) { this.name = name; this.color =color; } var cat1 = new Cat('小黑','白色') console.log(cat1.constructor === Cat) //true console.log(cat1); //Cat {name: "小黑", color: "白色"}
在默認狀況下,全部的原型對象都會自動得到一個constructor(構造函數)屬性
,這個屬性(是一個指針)指向 prototype 屬性所在的函數(Person)
上面這句話有點拗口,咱們「翻譯」一下:A 有一個默認的 constructor 屬性,這個屬性是一個指針,指向 Person。即:
Person.prototype.constructor === Person
實例的構造函數屬性(constructor)
指向構造函數 :person1.constructor == Person
person1 爲何有 constructor 屬性?那是由於 person1 是 Person 的實例。
那 Person.prototype 爲何有 constructor 屬性??同理, Person.prototype (你把它想象成 A) 也是Person 的實例。
也就是在 Person 建立的時候,建立了一個它的實例對象並賦值給它的 prototype,基本過程以下:
var A = new Person(); Person.prototype = A;
結論:原型對象(Person.prototype)是 構造函數(Person)的一個實例。