首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

理解js原型链,prototype与__proto__关系

首先,要明确几个点: 1.在JS里,万物皆对象。方法(Function)是对象,方法原型(Function.prototype)是对象。因此,它们都会具有对象共有的特点。...即:对象具有属性__proto__,可称为隐式原型,一个对象隐式原型指向构造该对象构造函数原型,这也保证了实例能够访问在构造函数原型定义属性和方法。...那么当我们调用p.Say()时,首先p没有Say这个属性, 于是,他就需要到他__proto__中去找,也就是Person.prototype,而我们在上面定义了 Person.prototype.Say...__proto__,也就是 Programmer.prototype,也就是p1去找,由于p1也没有Say,那就去p.__proto__....最后,其实prototype只是一个假象,他在实现原型链只是起到了一个辅助作用,换句话说,他只是在new时候有着一定价值,而原型链本质,其实在于__proto__!

1.2K80
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    帮你彻底搞懂JSprototype、__proto__与constructor(图解)

    前言   作为一名前端工程师,必须搞懂JSprototype、__proto__与constructor属性,相信很多初学者对这些属性存在许多困惑,容易把它们混淆,本文旨在帮助大家理清它们之间关系并彻底搞懂它们...proto缩写),实际上,该属性在ES标准定义名字应该是[[Prototype]],具体实现是由浏览器代理自己实现,谷歌浏览器实现就是将[[Prototype]]命名为__proto__,大家清楚这个标准定义与具体实现区别即可...但是由于JS函数也是一种对象,所以函数也拥有__proto__和constructor属性,这点是致使我们产生困惑很大原因之一。...每个函数在创建时候,JS会同时创建一个该函数对应prototype对象,而函数创建对象....本文就此结束了,希望对那些对JSprototype、__proto__与constructor属性有困惑同学有所帮助。

    1.2K20

    轻松理解JS面向对象,顺便搞懂prototype和__proto__

    这篇文章主要讲一下JS面向对象以及 __proto__,ptototype和constructor,这几个概念都是相关,所以一起讲了。...JS定义一个静态方法更简单,直接将它作为类函数属性就行: Puppy.statciFunc = function() { // statciFunc就是一个静态方法 console.log...总结 最后来个总结,其实前面小节标题就是核心了,我们再来总结下: JS函数可以作为函数使用,也可以作为类使用 作为类使用函数实例化时需要使用new 为了让函数具有类功能,函数都具有prototype...函数本身也是对象,也具有__proto__,他指向JS内置对象Function原型Function.prototype。...prototype本身也是对象,所以他也有__proto__,指向了他父级prototype。__proto__和prototype这种链式指向构成了JS原型链。

    2.4K62

    JavaScript __proto__ 和 prototype

    当你创建函数时,JS会为这个函数自动添加prototype属性,值是空对象。...而一旦你把这个函数当作构造函数(constructor)调用(即通过new关键字调用),那么JS就会帮你创建该构造函数实例,实例继承构造函数prototype所有属性和方法(实例通过设置自己__proto...对象__proto__指向自己构造函数prototype。obj.__proto__.__proto__...原型链由此产生,包括我们操作符instanceof正是通过探测obj....__proto__.__proto__... === Constructor.prototype来验证obj是否是Constructor实例。...prototype 作为一个对象是可以塞很多属性和方法。 __proto__ 每个对象都有一个隐式原型。每个对象都有一个__proto__属性,指向创建该对象函数prototype。

    38210

    protocol buffer proto文件

    1,支持基本类型 .proto Type Notes C++ Type Java Type double double double float float float int32 Uses variable-length...消息字段类型可以标记为optional.一个定义良好消息一般不会包含可选字段。当处理一个消息时候,如果数据不存在该字段,相应字段会使用默认值。这个默认值可以在消息描述里面写。...messages in each SearchResponse message – to do this, you can define a Result message type in the same .proto...implementation - the protocol buffer compiler will complain if you use one of these reserved numbers in your .proto...你会发现消息定义每个字段都有一个唯一数字标签。这些标签用来在二进制数据识别每个字段,而且如果已经开始使用最好不要改变标签。1到15标签需要1字节编码。标签在16到2047需要2字节。

    35330

    pbcproto3接入

    Protobuf proto3发布也有挺长一段时间了。现在很多新项目慢慢转变用proto3来开发。这篇文章主要记录一下我在给pbc写对proto3支持时一些信息,也许对其他童鞋也有点助益。...但是仍然有一些向前不兼容细节需要处理一下,所以有了这个改造 Proto2和Proto3差异 因为主要目的是兼容,所以下面会列出proto3得不同之处,并且会标注处理方法。...protobufrepeated字段有两种处理方式:第一种是由多个key-value对组成,也就是说repeated数据,key可能会出现多次;第二种是先有一个varint,表示个数,后面跟N个value...// 但是pb文件里似乎并没有这种信息,所以proto2和proto3库选择上只能二选一了。...这个适配只是做了兼容性适配,最好当然还是实现那些proto3新数据结构啦。而且这个proto_v3分支我并没有创建PR推回去。

    2.4K10

    彻底深刻理解js原型链之prototype,proto以及constructor(一)

    思考: js引用数据类型都属于函数对象吗?...指针proto JavaScript,万物皆对象!...基本类型值:指的是保存在栈内存简单数据段;除开函数对象之外对象都是普通对象,那么普通对象范围是包含基本数据类型 事实上(函数对象,普通对象)以及(基本数据类型,引用数据类型)是在不同角度对js变量进行定义...所以答案是 js报错(有没有一种被我坑了感觉) 构造器constructor思考题解答 思考:a.prototype.proto.constructor指向谁?...__proto__===null //true 这个例子告诉我们是 是null创造了一切,这不就是易经:“道生一,一生二,二生三,三生万物!” 作者:宜信技术学院 刘晓敏

    80110

    jssettimeout()用法详解_jssetattribute

    大家好,又见面了,我是你们朋友全栈君。 setTimeout与setTimeInterval均为window函数,使用顶层window一般都会省去,这两个函数经常稍不留神就使用错了。...setTimeout内函数先不执行,隔一段时间后再执行,函数后面的数字是隔时间,单位是毫秒(千分之一秒) 比如: setTimeout(‘alert(“hello world!”)’..., 400); setInterval() 方法可按照指定周期(以毫秒计)来调用函数或计算表达式,直到clearInterval()被调用或窗口被关闭。 比如: Stop interval setInterval动作作用是在播放动画时...如发现本站有涉嫌侵权/违法违规内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    14.9K20

    jsfind用法_jsfind函数

    今天我们要说是结合ES6新特性谈一下js里面的一个很好用方法-find() 现在前端和过去不一样,过去前端只要会画页面就行了,但是现在仅仅会画页面已经远远不够了,现在前端还需要会处理数据,而且还要会将数据分析分类处理...下面我们讲怎么用前端处理这块逻辑 首先我们拿到了所有的数据这里我直接放到一个测试用js里面存放, 要实现之前说效果,就需要使用我们今天主角find()方法。 find()是用来做什么呢?...find()方法返回数组符合测试函数条件第一个元素。否则返回undefined 在本文章需要注意几个点: ①、第一个元素 ②、测试函数 那么如何使用呢?.../find_testcodes.js" type="text/javascript" charset="utf-8">

    11.6K30

    JavaScript继承背后场景-prototype,__proto__, ]

    如上图所示,理解JavaScript继承关键是要理解母鸡如何产蛋过程。 [[prototype]]、__proto__、prototype三者之间联系 每个对象都可以有另一个对象作为其原型。...正如上图中看到那样,a.__ proto__暴露了指向Foo.prototype对象[[Prototype]]。同样,b.__ proto__也指向与a.__ proto__相同对象。...通过构造函数来创建对象 除了通过指定模式创建对象之外,构造函数还可以执行另一个有用操作 - 它会自动为新创建对象设置原型对象。此原型对象存储在构造函数原型对象属性。...Foo.prototype指向原型链某些位置,但Foo这个原型属性不是来自原型链。构成原型链proto指向链,以及proto指向对象。....__ proto__,链接到到foo .__ proto .proto__,等等,直到达到null(也就是咱们常说原型链顶部是null)。

    64110

    jsHook

    简单理解:   hook(钩子)就是: 把将要执行函数或者一系列动作注册到一个统一接口下面, 当应用程序调用此接口(即hook)时,就等于调用了这一系列动作。...JS钩子(hook)例子 JS钩子(hook)例子1: 例如我们在向后台进行ajax请求时候,后台经常会返回我们一些常见错误码,如:001代表用户不存在,002代表用户密码输入错误。...这个时候我们要将错误友好提示给用户。这个时候我们该怎样实现呢?...一般写法可能是: $.ajax(option,function(result){ var errCode = result.errCode ;//错误码 if(errCode){...switch case来实现,但是这个两种写法都无法避免一个问题就是如果我错误码特别多,那得写多少个if else和case 啊?

    6.5K31

    彻底弄懂prototype, __proto__, constructor, instanceof渊源

    __proto__ === null 最后是衍生: /** * 衍生两组关系 */ // 第四组关系:构造函数是new Function得到 // 所以 构造函数__proto__ 指向...这么理解: 构造函数是创建实例机器 实例在创建过程能获得什么属性,取决于机器藏了哪些属性 这坨属性藏在构造函数prototype属性上(称之为原型对象) 在new实例时候,给实例挂上__proto...Case 2 function Cat() {} insOf(new Cat(), Cat) insOf(new Cat(), Object) 稍微深究一下constructor和继承 第零组关系,...npm下载量很高is模块,有一行上古代码: if (type === '[object Function]') { return value.prototype === other.prototype...== Panel.prototype 如果函数不是构造函数或Class,比较prototype就毫无意义,类库里比较函数prototype在OOP不怎么盛行JS里作用十分有限 支持原创

    40320

    Js变量

    Js变量:  1:如果在var没有初始化变量值,则默认为undefined.  2:可以不用var来申明一个变量,但是在过程级申明一个变量时,就必须用var.   ...var currentCount  5: 在 JScript null 和 undefined 主要区别是 null 操作象数字 0,    而 undefined 操作象特殊值NaN (不是一个数字...请注意,比较大小时字符串自动转换为相等数字,但加法(连接)运算时保留为字符串。...js数据类型  1:Jscript 有三种主要数据类型、两种复合数据类型和两种特殊数据类型    主要(基本)数据类型是: 字符串 数值 布尔    复合(引用)数据类型是: 对象 数组    特殊数据类型是...: Null Undefined  2:测试是否已经声明变量 x :    if (typeof(x) == "undefined")      // 作某些操作 js内置对象  1:Jscript

    12.9K60

    Js堆栈

    Js堆栈 堆heap是动态分配内存,大小不定也不会自动释放,栈stack为自动分配内存空间,在代码执行过程自动释放。...栈区 在栈内存中提供一个供Js代码执行环境,关于作用域以及函数调用都是栈内存执行。...Js基本数据类型String、Number、Boolean、Null、Undefined、Symbol,占用空间小且大小固定,值直接保存在栈内存,是按值访问,对于Object引用类型,其指针放置于栈内存...,堆内存存储实际对象,在栈内存存储对象指针,对于对象访问是按引用访问,在堆区内存不会随着程序运行而自动释放,这就需要实现垃圾回收机制GC,需要注意是在Js没有类似于Cfree()函数去手动释放内存...,从而决定是否需要进行内存回收,在Js主要有引用计数与标记清除两种垃圾回收算法。

    3.1K30

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    热门标签

    领券