1.首先聊一下原型,原型其实就是函数的prototype的属性,用来存放这个函数的一个公共用的东西,但是这个设置了之后是隐藏的不显示的,只有当你new了一个新对象的时候获取新对象的属性的时候才会展示,所以这个原型是和new一起绑定使用的,至于为什么要用原型,发展如下:
为了能够大量的使用相同的对象,所以用了工厂函数来,但是工厂函数的话无法区别对象,返回的全是对象,为了解决这个问题于是使用构造函数,但是构造函数里面如果声明了函数,创建对象的时候就会一直重复构造函数,会对服务器造成压力,解决方法是可以吧函数命名在构造函数的外面,但是这样一来就会污染全局变量,没法达到封装的这种类似的效果,所以用原型的话可以轻松 的解决这个问题,将函数放到原型里面就好了....
2.关于下午原型碰到的一些小问题跟大家分享一下,直接上代码:
这段代码大家肯定知道输出的是一个函数吧,没错输出的就是say这个函数;
那么上面这几行有输出吗?输出的是什么呢?
大家自己尝试下,上面的输出也是say函数,那这里没有调用为什么也会出来函数呢,其实上面的输出的函数并不是调用出来的,而是new一个新对象的时候就会直接执行构造函数,那么里面的say方法就会直接调用函数直接执行,所以输出的并不是pp.say,而是new对象的时候输出了,
所以这行代码的输出呢?哈哈这行代码输出的是2个say函数,那么问题来了为什么say()执行了而pp.say没有执行,因为这2个其实就是一样的,那么这个问题的话就要说到这个js机制的问题了,因为构造函数new了新的以后调用那个函数,所以后面的对象的方法就不调用了,一个机制的问题,这个也是不经意间发现的东西,继续下面的代码
这块代码的输出结果是3个函数2个undefined;那么多出来的2个undefined和那个函数哪里来的,首先
console.log(say())这个输出会先执行say()这个方法,那么就会输出say函数,
根据上面说过的其实pp.say其实和say()是等价的只不过是由于机制的问题pp.say没有继续执行而已,所以这2个输出的结果就是一样的也就是undefined,至于这个值怎么来的其实我们详细写下就知道了,
console.log(pp.say)==console.log(say())==console.log((function say(){console.log(say)})())==console.log(console.log(say))所以先执行里面的console.log();然后执行外面的console,外面的console输出里面的console就会出现undefined