搜索
javascript - 构造函数,他本身是否具有他原型中的方法?
PHP中文网
PHP中文网 2017-04-10 16:22:31
[JavaScript讨论组]

前面一张图,它报错说Person没有say()这个功能;但是换种写法,比如下张图,他就有了,而且还弹出了两个 “你好”窗口,这就说明其实Person()它其实是执行了那个方法的;可前一张写法为什么会没有那个功能呢?

其实在我原来的理解中, 构造函数他本身应该是没有他原型里的方法的,可是这两个例子一比较,我觉得我蒙圈了!!!其实第一张图的报错,是符合我原来的想法的;可是第二张图,只是new了一下,它好像就执行了!!

我又在想是不是跟他 new出来之后,把他给了person这个变量有关呢,但是person他拿到的只是一个地址啊,只能说person他具有了 Person()构造函数里的方法,同时也具有了Person.prototype他原型里的方法,但他只是拿到了个地址不是吗,可是这样看,他好像就执行了!!

PHP中文网
PHP中文网

认证0级讲师

全部回复(2)
PHP中文网

函数即对象。你new的时候执行Person()函数,这个函数里面执行了this.say(),所以有2次。
为啥Person.say没有,因为你把Person这个当做对象了。Person就是那个构造函数。
就像一个人给你盖房子,房子里面有床,但是这个给你盖房子的人没有床。你改成Person.prototype.say()就可以打印了
就想想印钞机不等于钞票。say就像印出来的钞票上面有100元字样,这个不等于印钞机上面有100元字样。Person.prototype.say就是设计了一个印钞机,打印出来的钞票上面有100元字样。而你Person.say,相当于想找到印钞机上面的100元字样,显然没有
印出来的钞票是个对象,通样,印钞票的印钞机本身也是对象,这2个对象是不同的。

高洛峰

你即使不调用person.say(),只是实例化出person来,也会弹出一次。
因为实例化的过程中this指向了person并且准备调用say方法,此时person本身没有这个方法,于是沿着原型链向上查找,找到了person原型上的say方法并调用,弹出一次。
然后你又手动调用了一次,再弹出一次。
至于题目的问题,构造函数本身并不直接具备这个方法(不是很准确),但是它的prototype属性(而不是它的原型)上有这个方法,所以它可以用Person.prototype.say()调用(这个时候你可以把prototype理解成随便一个其他名字的属性,这个属性是个对象,里面有个say方法),而不能直接Person.say()
构造函数Person的原型是Functionprototype属性,即Person.__proto__ === Function.prototype

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号