prototype+顯式原型與隱式原型+原型鏈
阿新 • • 發佈:2021-07-08
一、210307原型prototype
1、函式的prototype屬性
- 每個函式都有一個prototype屬性,它預設指向一個Object空物件(即:原型物件)
- 原型物件中有一個屬性constructor,它指向函式物件
//1) console.log(Date.prototype, typeof Date.prototype) //Object "object" function Fun(){ } console.log(Fun.prototype) //預設指向一個object空物件(沒有我們的屬性) //2) console.log(Date.prototype.constructor===Date) //true console.log(Fun.prototype.construtor===Fun) //true
2、給原型物件新增屬性(一般是方法)
- 作用:函式的所有例項物件自動擁有原型中的屬性
Fun.prototype.test = function(){
console.log("test()")
}
二、210307顯式原型屬性與隱式原型屬性
- 每個函式都有一個prototype,顯式原型屬性
- 每個例項物件都有一個
__proto__
,隱式原型屬性 - 物件的隱式原型的值是其對應建構函式顯式原型的值
- 總結:
- 函式的prototype屬性:在定義函式時自動新增的,預設值是一個空object物件
- 物件的
__proto__
屬性:建立物件時自動新增的,預設值為建構函式的prototype屬性值 - es6之前,程式設計師能直接操作顯式屬性,但不能直接操作隱式原型屬性
//1)定義建構函式 function Fn(){ //內部語句:this.prototype={}沒有我們指定的屬性與方法 } console.log(Fn.prototype) //2)建立例項物件 var fn = new Fn() //內部語句this.__proto__=Fn.prototype console.log(fn.__proto__) //3) console.log(Fn.prototype === fn.__proto__) //true //給原型新增方法 Fn.prototype.test = function(){ console.log("test()") } //通過例項呼叫原型的方法 fn.test() //test()
三、210308原型鏈
-
訪問一個物件的屬性時,先在自身屬性中查詢,找到返回,如果沒有,再沿著
__proto__
這條鏈向上查詢,找到返回,如果最終沒找到,返回undefined(訪問一個物件的屬性時,先在自身屬性中查詢,找到返回,如果沒有,去原型物件中尋找,沒有去原型的原型中查詢,直到找到object物件的原型,object物件的原型沒有原型,返回undefined李立超)
-
別名:隱式原型鏈
-
作用:查詢物件的屬性(方法) 查詢變數看作用域鏈
console.log(Object) //ƒ Object() { [native code] }
console.log(Object.prototype) //
console.log(Object.prototype.__proto__) //null
function Fn(){
//this.prototype = {}
this.test1 = function(){
conolse.log("test1()")
}
}
console.log(Fn.prototype.__proto__ === Object.prototype) //true
console.log(Fn.prototype) //__proto__:Object object的例項物件
Fn.prototype.test2 = function(){
console.log("test2()")
}
var fn = new Fn() //例項物件的隱式原型屬性=建構函式的顯式原型屬性
console.log(Object.prototype == fn.__proto__.__proto__) //true
console.log(Fn.prototype === fn.__proto__); //true
fn.test1() //test1()
fn.test2() //test2() //先在自身找,根據隱式原型屬性找原型物件,沒有依舊根據隱式原型屬性找原型物件。
console.log(fn.toString()) //[Object Object]
//fn.test3() //not a function
//fn.test() //undefined
/*補充:
1、 函式的顯式原型指向物件,預設是空Object例項物件(但是Object不滿足)
*/
console.log(Fn.prototype instanceof Object) //true
console.log(Object.prototype instanceof Object)//false
console.log(Function.prototype instanceof Object)//true
/*
2、所有函式都是Function的例項(包含Function)
*/
console.log(Function.__proto__ === Function.prototype) //true
/*
3、Object的原型物件是原型鏈盡頭
*/
console.log(Object.prototype.__proto__) //null
四、210308建構函式/原型/例項物件的關係
例項物件的隱式原型屬性=建構函式的顯式原型屬性
五、210309補充
-
函式的顯式原型屬性指向物件Object,預設是空Object例項物件(除Object本身)
console.log(Fn.prototype instanceof Object)//true console.log(Function.prototype instanceof Object)//true console.log(Object.prototype instanceof Object)//false
-
所有函式都是Function的例項(包括Function本身)
所有函式都有一個隱式原型屬性指向Function的顯式原型屬性
console.log(Function.__proto__ === Function.prototype)//true
-
Object的原型物件是原型鏈的盡頭
console.log(Object.prototype.__proto__)//null