博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js中constructor和prototype
阅读量:6709 次
发布时间:2019-06-25

本文共 1216 字,大约阅读时间需要 4 分钟。

在最开始学习js的时候,我们在讲到原型链和构造函数的时候经常会有一个例子

如果我们定义函数如下:

function Foo() { /* .. */ }Foo.prototype.bar = function(){}; var a1 = new Foo();a1.constructor === Foo; // true!

但是如果我们中间改变了Foo.prototype的定义,那么a1.constructor的指向就改变了。

function Foo() { /* .. */ }Foo.prototype = { /* .. */ }; // 创建一个新原型对象var a1 = new Foo();a1.constructor === Foo; // false!a1.constructor === Object; // true!

对于这个事实,这里通过我的理解来解释一下。

首先js中并没有像java这种面向对象语言一样,Foo并不是作为一个类存在,而是普通的函数。当new操作符执行的时候,Foo函数作为构造函数调用,形成a1的原型链,将a1的__proto__关联到Foo.prototype,也就是说这里并不是复制的关系,只是关联,Foo.prototype改变时,a1.__proto__也会改变。

在第一个例子中a1.constructor === Foo;看起来是a1的constructor指向了Foo,但是事实并非如此。实际上,是在new的时候,a1.constructor被委托给了Foo.prototype.constructor,所以当第二个例子Foo.prototype = {}时,a1.constructor就不再指向Foo了,而是指向了Object。因为如下例子:

var Foo ={};console.log(Foo.constructor === Object);//true

也就是Foo.prototype的constructor属性只是在Foo函数声明的时候默认生成的。如果替换了Foo.prototype的引用,那么constructor也会随之发生改变。

 

总结:

1. constructor属性会在函数声明时默认生成。在利用new创建对象实例时,对象实例本身并没有constructor属性,但对象实例的__proto__属性和Foo.prototype属性关联,行程原型链,因此会通过原型链找到Foo.prototype.constructor属性,并以此为值。

2. prototype属性可能会被重写,重写后,原来的constructor会发生改变。如果显示为constructor赋值,可以纠正。

3. 因为constructor的属性很随意,所以慎用。

转载于:https://www.cnblogs.com/Candybunny/p/5488946.html

你可能感兴趣的文章
北京市定额发票真假查询地址
查看>>
演示:使用IPsec+PKI来完成IP通信的安全
查看>>
“赋能开发者”高峰论坛暨葡萄城联合龙头企业共建模板库正式启动
查看>>
SCCM2012系列之九,SCCM代理安装
查看>>
Exchange Server 2016管理系列课件09.删除和恢复已删除的邮箱
查看>>
Exchange 2013多租户托管PART 4:邮箱隔离管理配置
查看>>
课程所用软件下载地址
查看>>
Mary Meeker最新互联网趋势报告关键词:重写改变一切、轻资产时代
查看>>
KNN算法的實現
查看>>
HDU 1245 Saving James Bond
查看>>
SpringSecurity3整合CAS实现单点登录
查看>>
淘宝网架构分享总结[转]
查看>>
android异步任务详解 AsynTask
查看>>
XPath注入技术综述
查看>>
一步一步写算法(之挑选最大的n个数)
查看>>
mysql存储过程中传decimal值会自动四舍五入,没有小数
查看>>
java中文乱码解决之道(三)—–编码详情:伟大的创想—Unicode编码
查看>>
shiro安全框架
查看>>
php 返回上一页并刷新
查看>>
14. 星际争霸之php设计模式--状态模式
查看>>