原型链笔记
构造函数
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__: ƒ, …}
参考资料
- https://www.jianshu.com/p/5727780214ac
- http://www.ruanyifeng.com/blog/2011/06/designing_ideas_of_inheritance_mechanism_in_javascript.html
- https://www.jianshu.com/p/3d756c5bba16
本文来自博客园,作者:Bin_x,转载请注明原文链接:https://www.cnblogs.com/Bin-x/p/16016198.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)