image.png
/*
* 我们需要牢记两点:
* 1. __proto__属性是对象所独有的;
* 2. constructor属性: 只有prototype对象才有这个属性,而其它对象的constructor属性都是通过__proto__对象从prototype继承而来
* 3. prototype属性是函数所独有的,因为函数也是一种对象,所以函数也拥有__proto__和constructor属性。
* __proto__属性的作用就是当访问一个对象的属性时,如果该对象内部不存在这个属性,那么就会去它的__proto__属性所指向的那个对象(父对象)里找,一直找,
* 直到__proto__属性的终点null,然后返回undefined,再往上找就相当于在null上取值,会报错。通过__proto__属性将对象连接起来的这条链路即我们所谓的原型链。
* prototype属性的作用就是让该函数所实例化的对象们都可以找到公用的属性和方法,即f1.__proto__ === Foo.prototype。
* constructor属性的含义就是指向该对象的构造函数,所有函数(此时看成对象了)最终的构造函数都指向Function。 另外 __proto__ 属性是浏览器对es5的实现,而不是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
// 函数在创建时,JS会为该函数创建一个对应的prototype对象,而这个prototype对象的constructor属性又指向该函数,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
简书
网友评论