image.png
/*
* 我們需要牢記兩點:
* 1. __proto__屬性是對象所獨有的壮虫;
* 2. constructor屬性: 只有prototype對象才有這個屬性,而其它對象的constructor屬性都是通過__proto__對象從prototype繼承而來
* 3. prototype屬性是函數(shù)所獨有的,因為函數(shù)也是一種對象肛搬,所以函數(shù)也擁有__proto__和constructor屬性岸啡。
* __proto__屬性的作用就是當訪問一個對象的屬性時,如果該對象內部不存在這個屬性抚恒,那么就會去它的__proto__屬性所指向的那個對象(父對象)里找咱台,一直找,
* 直到__proto__屬性的終點null俭驮,然后返回undefined回溺,再往上找就相當于在null上取值,會報錯混萝。通過__proto__屬性將對象連接起來的這條鏈路即我們所謂的原型鏈遗遵。
* prototype屬性的作用就是讓該函數(shù)所實例化的對象們都可以找到公用的屬性和方法,即f1.__proto__ === Foo.prototype逸嘀。
* constructor屬性的含義就是指向該對象的構造函數(shù)车要,所有函數(shù)(此時看成對象了)最終的構造函數(shù)都指向Function。 另外 __proto__ 屬性是瀏覽器對es5的實現(xiàn)崭倘,而不是es標準屯蹦。
* */
// 互相繼承
console.log(Object instanceof Function); // true
console.log(Function instanceof Object); // true
console.log(Object.constructor)
console.log(Function.constructor)
function demo () {}
//tips:單從constructor屬性來講,只有prototype對象才有這個屬性绳姨,而其它對象的constructor屬性都是通過__proto__對象從prototype繼承而來
console.log(demo.constructor === Function) // true
console.log(demo.prototype.constructor === demo) // true
// 函數(shù)在創(chuàng)建時登澜,JS會為該函數(shù)創(chuàng)建一個對應的prototype對象,而這個prototype對象的constructor屬性又指向該函數(shù)飘庄,demo.prototype.constructor === demo
const a = new Object()
console.log(typeof Object); // function
console.log(typeof a) // object
console.log(typeof Object.__proto__) // function
console.log(typeof a.__proto__) // object