Skip to content
索引

person1.__proto__ === Person.prototype

每个对象的__proto__属性指向它的原型对象,该对象构造函数的prototype属性也指向它的原型对象

两者指向的都是该对象的原型对象

所以也可以说,每个对象的__proto__指向它构造函数的prototype

Person.__proto__ === Function.prototype

函数也是对象,所以构造函数也是对象,所以构造函数也有__proto__

函数的构造函数是 Function

它的__proto__属性指向的是Function.prototype

Function和Object原型对象相同

js
console.log(Function.__proto__ === Object.__proto__); // true
console.log(Function.__proto__); // 控制台输出ƒ () { [native code] }
console.log(Object.__proto__); // 控制台输出ƒ () { [native code] }
console.log(Function.__proto__ === Object.__proto__); // true
console.log(Function.__proto__); // 控制台输出ƒ () { [native code] }
console.log(Object.__proto__); // 控制台输出ƒ () { [native code] }

是V8内部C++代码返回的结果,而不是真实的JS代码结果

第 1710 行附近的 FunctionSourceString 函数:

js
return 'function () { [native code] }';
return 'function () { [native code] }';

对象的构造函数都是Object

原型对象本身是一个普通对象,而普通对象的构造函数都是Object

Person.prototype.__proto__ === Object.prototype

js


js
// 因为函数也是对象,即构造函数也是对象,所以构造函数也有__proto__属性
// 函数(构造函数)的构造函数是Function
// 它的__proto__属性指向的是Function.prototype
// 那么这就导致了,与Object是实例对象的构造函数,这条规律冲突了
console.log(Person.__proto__ === Function.prototype); // true

// Function是它自己的构造函数
console.log(Function.__proto__ === Function.prototype); // true


// Object是一切实例对象的构造函数(除了Function.__proto__)
console.log(Function.__proto__ === Object.prototype); // false

// Function和Object的原型对象相等
console.log(Function.__proto__ === Object.__proto__); // true

// Object不是它自己的构造函数
console.log(Object.__proto__ === Object.prototype); // false

// Function是Object的构造函数
// 所有的构造函数都是函数对象,函数对象都是Function构造产生的
console.log(Object.__proto__ === Function.prototype); // true

// 说明Object是Function.__proto__的构造函数,说明Object是一切实例对象的构造函数
console.log(Function.__proto__.__proto__ === Object.prototype); // true

// 说明Object是Function实例对象的实例对象的构造函数
// 说明Object是一切实例对象的构造函数
console.log(Function.prototype.__proto__ === Object.prototype); // true

// Object的原型对象也有__proto__属性指向null
// 说明null是原型链的顶端,也说明只要是原型对象就有__proto__属性
console.log(Object.prototype.__proto__ === null); // true

// Function的原型对象也有__proto__属性指向null
// 说明null是原型链的顶端,也说明只要是原型对象就有__proto__属性
console.log(Function.prototype.__proto__ === null); // true
// 因为函数也是对象,即构造函数也是对象,所以构造函数也有__proto__属性
// 函数(构造函数)的构造函数是Function
// 它的__proto__属性指向的是Function.prototype
// 那么这就导致了,与Object是实例对象的构造函数,这条规律冲突了
console.log(Person.__proto__ === Function.prototype); // true

// Function是它自己的构造函数
console.log(Function.__proto__ === Function.prototype); // true


// Object是一切实例对象的构造函数(除了Function.__proto__)
console.log(Function.__proto__ === Object.prototype); // false

// Function和Object的原型对象相等
console.log(Function.__proto__ === Object.__proto__); // true

// Object不是它自己的构造函数
console.log(Object.__proto__ === Object.prototype); // false

// Function是Object的构造函数
// 所有的构造函数都是函数对象,函数对象都是Function构造产生的
console.log(Object.__proto__ === Function.prototype); // true

// 说明Object是Function.__proto__的构造函数,说明Object是一切实例对象的构造函数
console.log(Function.__proto__.__proto__ === Object.prototype); // true

// 说明Object是Function实例对象的实例对象的构造函数
// 说明Object是一切实例对象的构造函数
console.log(Function.prototype.__proto__ === Object.prototype); // true

// Object的原型对象也有__proto__属性指向null
// 说明null是原型链的顶端,也说明只要是原型对象就有__proto__属性
console.log(Object.prototype.__proto__ === null); // true

// Function的原型对象也有__proto__属性指向null
// 说明null是原型链的顶端,也说明只要是原型对象就有__proto__属性
console.log(Function.prototype.__proto__ === null); // true

Object是一切原型对象的构造函数(除了Function.proto

实例对象

下面作出总结:

  • 一切对象都是继承自Object对象,Object 对象直接继承根源对象null
  • 一切的函数对象(包括 Object 对象),都是继承自 Function 对象
  • Object 对象直接继承自 Function 对象
  • Function对象的__proto__会指向自己的原型对象,最终还是继承自Object对象

Released under the MIT License.