原型链笔记

构造函数

Function的构造函数是它本身,Object,String,Number,Date,Array的构造函数均是Function,万物皆Function

Function
// ƒ Function() { [native code] }

prototype

prototype是函数才有的属性,是为了继承而出现的。

对象实例化了某个函数,函数的prototype对象中的属性和方法会作为这些对象的公有属性和方法。

 

__proto__

__proto__是每个对象都有的属性。

大多数情况下,__proto__可以理解为“构造器的原型”,即构造函数的prototype。

// 通用公式在大部分情况下成立
T.__proto__ === T.constructor.prototype


//例如

'a'.__proto__ === String.prototype // true

Object.__proto__ === Function.prototype // true

let obj={}
obj.constructor === Object
obj.__proto__ === Object.prototype // true

function fun() {}
fun.constructor === Function
fun.__proto__ === Function.prototype // true

//由于所有基本类型的prototype.__proto__均一致,得到如下结论
'a'.__proto__.__proto__ === String.prototype.__proto__ === Object.prototype

 

Object.create

Object.create()方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__。

产生的新对象,其构造函数为Object,__proto__是现有的对象

let a1 = { a: 1 };

let a2 = Object.create(a1);
a2.__proto__ === a1 // true
a2.constructor === Object // true

let a3 = Object.create(a1.__proto__);
a3.__proto__ === a1.__proto__ === a1.constructor.prototype === Object.prototype  // true
a3.constructor === Object  // true

 

note

Function.__proto__ 与 Function.prototype 为底层代码

// 基本类型__proto__均一致
Function.__proto__ = Object.__proto__ = String.__proto__ = Number.__proto__

Function.prototype === Function.__proto__ // true
// 均为 ƒ () { [native code] }

一个比较特殊的例子

Object.prototype.__proto__ === null
// Function,String,Number,Array的prototype.__proto__均一致
Object.prototype === Function.prototype.__proto__ === String.prototype.__proto__
// {constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, …}

参考资料

  1. https://www.jianshu.com/p/5727780214ac
  2. http://www.ruanyifeng.com/blog/2011/06/designing_ideas_of_inheritance_mechanism_in_javascript.html
  3. https://www.jianshu.com/p/3d756c5bba16
posted @   Bin_x  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示