原型鍊:隻要是對象就有原型,并且原型也是對象,是以隻要定義了一個對象,那麼就可以找到它的原型,如此反複,就可以構成一個對象的序列,這個結構就被稱為原型鍊
原型:_proto_隐式原型 prototype顯式原型
總結:1、對象有屬性_proto_,指向該對象的構造函數的原型對象
2、方法除了有屬性_proto_,還有屬性prototype,prototype指向該方法的原型對象
重點1:在JS裡,萬物皆對象。方法(Function)是對象,方法的原型(Function.prototype)是對象。是以,它們都具有對象共有的特點。即:對象都具有屬性_proto_,可稱為隐式原型,一個對象的隐式原型指向構造該對象的構造函數的原型,這也保證了執行個體能夠通路在構造函數原型中定義的屬性和方法。
重點2:方法(Function)這個特殊的對象,除了和其他對象一樣有上述_proto_屬性外,還有自己特有的屬性——原型屬性(prototype),這個屬性就是一個指針,指向一個對象,這個對象的用途就是包含所有執行個體共享的屬性和方法(我們把這個對象叫做原型對象)。原型對象也有一個屬性,叫做constructor, 這個屬性包含了一個指針,指向原構造函數。
拓展:
js建立對象的方式:
1、字面量方式:
var a = {}
console.log(a._proto_) //Object {}
console.log(a._proto_ === a.constructor.prototype) //true
2、構造器方式:
var A = function() {}
var a = new A()
console.log(a._proto_) //A {}
console.log(a._proto_ === a.constructor.protorype) //true
3、Object.create()方式:
var a1 = {aa: 1}
var a2 = Object.create(a1)
console.log(a2._proto_) //Object {aa: 1}
console.log(a._proto_ === a.constructor.prototype) //true