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
对象