__proto__ 与 prototype 继承之等式篇

119 阅读2分钟

引子
隐式原型,显式原型(原型对象),构造函数,js 蛋鸡问题
prototype,prototype,constructor

1.创建的对象都是有 构造函数 ,对象具有的属性__proto__指向该对象 构造函数 的原型prototype,即
XXXX.proto===YYYY.prototype
==》YYYY 为 XXXX 的构造函数 ==》XXXX 为 YYYY 的实例对象 ==》XXXX instanceof YYYY === true

2.函数原型为对象,函数为对象
Function.prototype.proto===Object.prototype
==》Object 为 Function.prototype 的构造函数 ==》Function.prototype 为 Object 的实例对象 ==》Function.prototype instanceof Object === true
==》Function instanceof Object === true

3.作为函数的顶级构造函数Function
Function.proto === Function.prototype
==》Function 为 Function 的构造函数 ==》Function instanceof Function==true

综合2与3得出
Function.proto.proto === Object.prototype
==》Object 为 Function 的构造函数 ==》Function instanceof Object === true

4.作为对象顶级构造函数Object
Object.proto === Function.prototype
==》Function 为 Object 的构造函数 ==》Object 为 Function 的实例对象 ==》Object instanceof Function === true

Object.prototype.proto===null
==》Object.prototype.proto!==Function.prototype ==》Function 非 Object.prototype 的构造函数==》Object对象原型不是函数,它是空的

5.其它构造函数 Number,String,Array,Boolean
(Number|String|Array|Boolean).proto===Function.prototype
(Number|String|Array|Boolean) instanceof (Object|Function) === true
(Object|Function) instanceof (Object|Function) ==true

6.constructor
Object===Object.prototype.constructor
Function===Function.prototype.constructor
Number|String|Array|Boolean...

7.总结示例
let obj = {},fun=function(){}
obj.proto===Object.prototype,
obj instanceof Object === true;
obj instanceof Function === false;

fun.proto===Function.prototype,
fun.proto.proto==Object.prototype
fun instanceof Function === true;
fun instanceof Object === true;

说法:
1.一切皆对象,函数也是对象
2.对象的隐式原型__prototype__会指向其 构造函数 的显式原型prototype
3.一般对象实例和构造函数都有 隐式原型__proto__,一般对象实例的隐式原型指向Object的显式原型prototype,函数及构造函数的隐式原型__proto__则指向Function的显式原型prototype
4.函数(构造函数)的显式原型的构造函数为其本身,一般对象无显式原型

一般说原型对象是指prototype

显式原型的作用:用来实现基于原型的继承与属性的共享。
隐式原型的作用:构成原型链,同样用于实现基于原型的继承。举个例子,当我们访问obj这个对象中的x属性时,如果在obj中找不到,那么就会沿着__proto__依次查找。
obj.proto.proto.proto.proto.proto...形成原型链,最终找到Object.prototype

引入示例
function Person() { }
// 原型属性
Person.prototype.name = ‘Jiang’
var person1 = new Person()
// 实例属性
person1.name = ‘J’
console.log(person1.name) // J
console.log(person1.proto.name) // Jiang
实例属性会屏蔽原型属性,记住只是屏蔽,不会修改

示例引用
segmentfault.com/a/119000001…
———————————————— 版权声明:本文为CSDN博主「凤凰涅檠」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:blog.csdn.net/ch_weni/art…