__proto__ 与 prototype 继承之等式篇

引子
隐式原型,显式原型(原型对象),构造函数,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
实例属性会屏蔽原型属性,记住只是屏蔽,不会修改

以上引用
https://segmentfault.com/a/1190000012553959

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值