打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
浅谈JS中对象、函数的
JS中每个对象都会有__proto__属性,默认为Object,例如:
var a={};//这里对象a的__proto__属性就是Object
  • 1
  • 1

proto属性的作用主要是用来确定当前对象的继承者,在当前对象找不到指定的属性和对象时,会去proto属性指定的对象中寻找,之后依次类推直到找完所有继承或找到要找的属性为止

js的函数会有一个默认的prototype对象,这个prototype对象用来指定函数的继承关系,prototype对象默认有两个属性,一个是constructor,另一个就是proto属性,默认的prototype对象在被改变之前就像是这个函数用来表示自己的一个对象,其中proto属性和普通对象的proto属性一样用来对应继承关系,而constructor属性则代表了函数本身,举个例子:

//console下的结果function a(){alert(1)}a.prototype.constructor;//function a(){alert(1)}var b={x:1}a.prototype=b;//设置继承var c=new a();c.x//1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

基本来说就是a继承了对象b中的属性或者方法。

最后说一下new的原理,用上面代码中提到的new来举例,new的过程是先生成一个空对象给c,然后把c的proto属性指向a的prototype对象,最后执行a.call(c)来构造对象c。总的来说由于对象c的继承指向了a的prototype对象也就是b,所以c能拿到b中的x属性,证明a和b的继承关系。

这里特别要说明一下,由于c的proto属性指向了a的prototype,所以c的constructor也变为a的prototype的constructor,这样会产生一些问题,因为原本可以向这样使用c()来实现a的方法,但现在由于a的prototype是b,所以a的constructor会变为b的constructor,这样调用就不会调用a方法而是调用b的constructor方法。所以必须执行一下代码来纠正这个问题。

a.prototype.constructor=a;//将a的原型的constructor属性改回原来的或者可以这样写 c.constructor=a;//c在找不到constructor属性的时候会去proto找
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

c()就会依然调用原来的a方法,继承也不会受影响。当然,如果你就是要用prototype的constructor方法那就不需要修改了~~

差不多就是这些了,都是自己的一些理解,本人是做后端的,对前端可能理解的不好,希望前端高手指出问题,一起进步~~

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
js原型原型链
Js 控件编写 继承:extend、mixin和plugin(一)
JS原型与原型链终极详解
js 原型链
JS学习笔记 原型链和利用原型实现继承
JavaScript前端开发案例教程-第12章 面向对象编程
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服