
constructor属性解析
发布日期:2021-05-19 02:28:54
浏览次数:16
分类:博客文章
本文共 1875 字,大约阅读时间需要 6 分钟。
JavaScript中constructor属性一直不是很清楚,今日终于弄清了其中缘由,下面举例说明。
首先是一个典型的JavaScript实例声明:
function Person(){ this.name = name;}var p = new Person('Joe');console.log(p.constructor === Person); //trueconsole.log(p.__proto__ === Person.prototype); //true
如果此时对Person的prototype中添加属性或函数:
function Person(){ this.name = name;}Person.prototype.getName = function(){ return this.name;}var p = new Person('Joe');console.log(p.constructor === Person); //trueconsole.log(p.__proto__ === Person.prototype); //true
但是如果对Person的prototype重新定义,将会产生如下结果:
function Person(){ this.name = name;}Person.prototype = { getName : function(){ return this.name; }}var p = new Person('Joe');console.log(p.constructor === Person); //falseconsole.log(p.__proto__ === Person.prototype); //true
这里面关系到constructor属性的归属问题,本人试着用下面的代码验证:
Person.__proto__.constructor===Person.constructor //truep.__proto__.constructor === p.constructor; //true
经过上述验证,可以证明constructor其实是__proto__的属性(此处存疑,因为是个人验证,不清楚上面的验证代码是否精准,如果有误,希望各位指出)。
根据new的工作原理(详见http://www.cnblogs.com/ihardcoder/p/3667372.html),我们知道
p.__proto__ = Person.prototype;
所以
p.constructor = p.__proto__.constructor = Person.prototype.constructor
这样就将问题追溯到Person的prototype指向问题。当用Person.prototype = {}的方式重新定义时,同样根据new的工作原理,其实产生如下改变:
Person.prototype.__proto__ = Object.prototype
从而
p.constructor = Person.prototype.constructor = Person.prototype.__proto__.constructor = Object.prototype.constructor
此时
p.constructor === Object; //true
如何避免constructor属性的混乱,归根结底,我们需要做的是保证instance的constructor属性指向Person.prototype.constructor,而不是Person的父类,所以当修改Person.prototype时需要保证Person.prototype.constructor指向自己。
function Person(){ this.name = name;}Person.prototype = { getName : function(){ return this.name; }}Person.prototype.constructor = Person;var p = new Person('Joe');console.log(p.constructor === Person); //falseconsole.log(p.__proto__ === Person.prototype); //true
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年04月20日 05时45分59秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
568【毕设课设】基于单片机多路温度采集显示报警控制系统设计
2019-03-15
基于8086交通灯系统仿真设计(微机原理设计资料)
2019-03-15
解读域名管理之:域名注册机构介绍
2019-03-15
找中位数
2019-03-15
这些运维发展方向及系统运维技能都不了解,怎么能吃透Linux??
2019-03-15
自动化测试——UI自动化测试的痛点
2019-03-15
如何将萌推商品主图、属性图、详情图批量保存到电脑的方法
2019-03-15
2021年N1叉车司机模拟考试及N1叉车司机考试软件
2019-03-15
【奇淫巧技】Java动态代理(JDK和cglib)
2019-03-15
【Stimulsoft Reports.Net教程】使用DesignerFx
2019-03-15
攻防世界 Pwn 新手
2019-03-15
mybtis-plus 出现 Wrong namespace
2019-03-15
用户登陆的验证码的制作
2019-03-16
升级java11后,maven命令打包报错
2019-03-16
springboot redis key乱码
2019-03-16
Win10禁用自带的笔记本键盘
2019-03-16
insmod模块的几种常见错误
2019-03-16
写时复制集合 —— CopyOnWriteArrayList
2019-03-16
什么是redis的缓存雪崩, 穿透, 击穿?
2019-03-16