前面一张图,它报错说Person没有say()这个功能;但是换种写法,比如下张图,他就有了,而且还弹出了两个 “你好”窗口,这就说明其实Person()它其实是执行了那个方法的;可前一张写法为什么会没有那个功能呢?
其实在我原来的理解中, 构造函数他本身应该是没有他原型里的方法的,可是这两个例子一比较,我觉得我蒙圈了!!!其实第一张图的报错,是符合我原来的想法的;可是第二张图,只是new了一下,它好像就执行了!!
我又在想是不是跟他 new出来之后,把他给了person这个变量有关呢,但是person他拿到的只是一个地址啊,只能说person他具有了 Person()构造函数里的方法,同时也具有了Person.prototype他原型里的方法,但他只是拿到了个地址不是吗,可是这样看,他好像就执行了!!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
函数即对象。你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
的原型是Function
的prototype
属性,即Person.__proto__ === Function.prototype