原型與原型鏈
原型
- 每一個函數都有一個屬性:prototype,默認指向object空對象,就是原型對象,原型對象有一個constructor屬性,指向函數對象
- 每一個實例化對象都有一個屬性 proto ,默認指向構造函數的原型對象(是構造函數原型對象的一個引用)
var Fun = function(){// console.log("構造函數")}console.log(Fun.prototype.constructor === Fun) // truevar fu = new Fun()console.log(fu.__proto__ === Fun.prototype) //trueFun.prototype.newfun = function(){console.log("新方法")}fu.newfun()
[外鏈圖片轉存失敗(img-dSAsDvPJ-1562680215660)(image/proto.png)]
原型鏈
- 所有函數都是Function的實例,包括Function()自己和Object(),也就是所有函數都有一個__proto__屬性,指向Function的顯式原型(Function.prototype)
- Object是所有對象的構造函數,尋找對象的屬性或方法時,最終會找到Object,Object的隱式原型是Null,如果在Object中還沒找到對應的屬性或方法,就會為underfind
console.log(Function.prototype)
console.log(Fun instanceof Function) //true
console.log(Object instanceof Function) //true
console.log(Function instanceof Object) // true
console.log(Function instanceof Function) //trueconsole.log(Object.prototype === Fun.prototype.__proto__) // true
console.log(Object.prototype.__proto__) // nullconsole.log(Function.prototype === Object.__proto__) // true
console.log(Function.__proto__ === Function.prototype) // true
console.log(Function.prototype.__proto__ === Object.prototype) // true
[外鏈圖片轉存失敗(img-8rF7HpZg-1562680215677)(image/proto2.jpg)]
總結
- 原型與原型鏈
- 原型
- 顯式原型與隱式原型
- 每一個構造函數都會有一個prototype屬性,指向一個Object空對象,就是顯式原型
- 每一個實例化對象都有一個__proto__屬性,指向其構造函數的顯式原型的值
- 顯式原型與隱式原型
- 原型鏈:查找對象的屬性和方法
- 所有函數都是Function的實例,包括Function自己和Object()
Function.__proto__ === Function.prototype
- 所有對象都是由Object實例化而來,
- 所有對象在尋找某個屬性或方法時,最終會找到Object中
- Object.proto = null
- Object instanceof Function 為true,而反過來Function instanceof Object 也為true,他們互相是對方的構造函數
- 所有函數都是Function的實例,包括Function自己和Object()
- 原型