1. 程式人生 > 其它 >prototype+顯式原型與隱式原型+原型鏈

prototype+顯式原型與隱式原型+原型鏈

一、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顯式原型屬性與隱式原型屬性

  1. 每個函式都有一個prototype,顯式原型屬性
  2. 每個例項物件都有一個__proto__,隱式原型屬性
  3. 物件的隱式原型的值是其對應建構函式顯式原型的值
  4. 總結:
    • 函式的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原型鏈

  1. 訪問一個物件的屬性時,先在自身屬性中查詢,找到返回,如果沒有,再沿著__proto__這條鏈向上查詢,找到返回,如果最終沒找到,返回undefined

    (訪問一個物件的屬性時,先在自身屬性中查詢,找到返回,如果沒有,去原型物件中尋找,沒有去原型的原型中查詢,直到找到object物件的原型,object物件的原型沒有原型,返回undefined李立超)

  2. 別名:隱式原型鏈

  3. 作用:查詢物件的屬性(方法) 查詢變數看作用域鏈

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補充

  1. 函式的顯式原型屬性指向物件Object,預設是空Object例項物件(除Object本身)
    console.log(Fn.prototype instanceof Object)//true
    console.log(Function.prototype instanceof Object)//true
    console.log(Object.prototype instanceof Object)//false
    
  2. 所有函式都是Function的例項(包括Function本身)

    所有函式都有一個隱式原型屬性指向Function的顯式原型屬性

    console.log(Function.__proto__ === Function.prototype)//true
    
  3. Object的原型物件是原型鏈的盡頭
    console.log(Object.prototype.__proto__)//null