上一篇:继承与原型链

一:每个对象都有 proto 属性,但只有函数对象才有 prototype 属性

注:Function.prototype为空函数,没有prototype(箭头函数也没有

function Person() {}

var person1 = new Person();

所有的原型对象都会自动获得一个 constructor(构造函数)属性,这个属性(是一个指针)指向 prototype 属性所在的函数(Person)

person1.constructor == Person
Person.prototype.constructor == Person

结论:原型对象(Person.prototype)是 构造函数(Person)的一个实例。

function Person(){};
console.log(Person.prototype) //Person{}
console.log(typeof Person.prototype) //Object
<span style="color: rgb(249, 150, 59); font-size: x-large;">console.log(typeof Function.prototype) // Function,这个特殊(为空函数
console.log(typeof Object.prototype) // Object
console.log(typeof Function.prototype.prototype) //undefined

Function.prototype 为什么是函数对象呢?

var A = new Function ();
Function.prototype = A;

凡是通过 new Function( ) 产生的对象都是函数对象。因为 A 是函数对象,所以Function.prototype 是函数对象。

所有函数对象proto都指向 Function.prototype,它是一个空函数(Empty function)

所有对象的__proto__都指向其构造器的prototype

console.log(Function.prototype.proto === Object.prototype) // true

二:原型链

  • 1、person1.__proto__ 是什么?
  • 2、Person.__proto__ 是什么?
  • 3、Person.prototype.__proto__ 是什么?
  • 4、Object.__proto__ 是什么?
  • 5、Object.prototype__proto__ 是什么?
  • 答案:

    第一题:

    因为 person1.proto === person1 的构造函数.prototype

    因为 person1的构造函数 === Person

    所以 person1.proto === Person.prototype

    第二题:

    因为 Person.proto === Person的构造函数.prototype

    因为 Person的构造函数 === Function

    所以 Person.proto === Function.prototype

    第三题:

    Person.prototype 是一个普通对象,我们无需关注它有哪些属性,只要记住它是一个普通对象。

    因为一个普通对象的构造函数 === Object

    所以 Person.prototype.proto === Object.prototype

    第四题,参照第二题,因为 Person 和 Object 一样都是构造函数

    第五题:

    Object.prototype 对象也有proto属性,但它比较特殊,为 null 。因为 null 处于原型链的顶端,这个只能记住。

    Object.prototype.proto === null

    拓展:
    最详尽的 JS 原型与原型链终极详解