原型
了解原型鏈,我們先了解下原型
- 所有的對(duì)象都有toString()、valueOf()、constructor肠套、hasOwnProperty()等
- 所有的數(shù)組都是有對(duì)象應(yīng)該有的屬性
- 所有的數(shù)組都有push()、shift()风罩、join()糠排、slice()、splice()等
- var array = [] 應(yīng)該有數(shù)組共有的所有屬性
var array = []
我們用console.dir()檢測(cè)下array有什么屬性
我們發(fā)現(xiàn) console.dir(array) 打出來的結(jié)果是:
- array 有一個(gè)屬性叫做
__proto__
(它是一個(gè)對(duì)象) -
array.__proto__
有很多屬性超升,包括 push()入宦、shift()、join()室琢、slice()乾闰、splice()等 -
array.__proto__
其實(shí)也有一個(gè)叫做__proto__
的屬性,包括toString()盈滴、valueOf()涯肩、constructor、hasOwnProperty()等 -
array.__proto__.__proto__
其實(shí)也有一個(gè)叫做__proto__
的屬性(console.log 沒有顯示)巢钓,值為 null
原型鏈
當(dāng)我們讀取 array.toString 時(shí)病苗,JS 引擎會(huì)做下面的事情:
看看 array 數(shù)組本身有沒有 toString 屬性。沒有就走到下一步症汹。
看看
array.__proto__
有沒有 toString 屬性硫朦,發(fā)現(xiàn)array.__proto__
有 toString 屬性,于是找到了
所以 array.toString
實(shí)際上就是第 2 步中找到的 array.__proto__.toString
背镇。
可以想象咬展,
如果
array.__proto__
沒有泽裳,那么瀏覽器會(huì)繼續(xù)查看array.__proto__.__proto__
如果
array.__proto__.__proto__
也沒有,那么瀏覽器會(huì)繼續(xù)查看array.__proto__.__proto__.__proto__
直到找到 toString 或者
__proto__
為 null破婆。
上面這個(gè)搜索過程涮总,是連著由 __proto__
組成的鏈子一直走的。
這個(gè)鏈子祷舀,就叫做原型鏈瀑梗。
API
hasOwnProperty() 方法
hasOwnProperty() 方法會(huì)返回一個(gè)布爾值,指示對(duì)象是否具有指定的屬性作為自身(不繼承)屬性裳扯。
var o = {
name:'jack'
}
o.hasOwnProperty('name'); // true
o.hasOwnProperty('toString'); // false
Object.create() 方法
Object.create() 方法使用指定的原型對(duì)象和其屬性創(chuàng)建了一個(gè)新的對(duì)象夺克。
var a ={
name:'jack'
}
var b = {
form:'china'
}
a = Object.create(b)
prototype
對(duì)象.__proto__
=== 對(duì)象.constructor.prototype
function Person(){}
Person.prototype.name = 'jack'
var person= new Person()
console.log(person.name) // jack
console.log(person.__proto__ === Person.prototype) // true
console.log(Person.__proto__ === Person.constructor.prototype) // true
console.log(Person.__proto__ === Function.prototype) //true
console.log(Person.prototype.constructor === Person) // true
console.log(Object.prototype.__proto__ === null) // true
console.log(Object.prototype.constructor === Object) // true
console.log(person.constructor === Person) // true
console.log(person.constructor === Person.prototype.constructor) // true
只有對(duì)象才有 __proto__
,只有函數(shù)才有 prototype
嚎朽。