最后
总的来说,面试官要是考察思路就会从你实际做过的项目入手,考察你实际编码能力,就会让你在电脑敲代码,看你用什么编辑器、插件、编码习惯等。所以我们在回答面试官问题时,有一个清晰的逻辑思路,清楚知道自己在和面试官说项目说技术时的话就好了
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
使用函数的方式返回对象时,虽然看上去都是返回了checkObject 对象,但是实际上返回的每次都是一个新的对象。
虽然对象中的方法执行的都是相同的语句,但是值并不同,并且修改其中一个对象的方法(比如a.checkName)不会影响到另外一个对象中的方法(比如b.checkName)
总结:每次通过 return 返回的对象都是一个新的对象,就像是克隆体,虽然长得一模一样,但是都是相互独立的个体。
虽然通过函数return的方式可以批发对象,完成我们的需求了,但是这毕竟不是一个真正意义上创建类的方式,并且创建的对象a、b和checkObject没有任何关系(使用人突然return 返回的对象本生就和checkObject无关),所以接下来我们要改造一下。
因为类里面的方法都是通过this定义的,所以每次通过 new 关键字创建新对象的时候,新对象都会对类的this上的属性进行赋值,所以这些新创建的对象都会有一套自己的方法。但是有时候这么做造成的消耗是很奢侈的(每一个新对象一个比作一个朋友,对象里的方法比作搭出租车,如果每个朋友做的车都不一样,那肯定要消耗更多的钱。但是如果朋友拼的是同一辆车,那消耗自然就降低了),我们需要处理一下。
可以看到 a 和 b 是不同的对象,但是他们的 .checkName() 方法是同一个,都是指向checkObject.prototype.checkName。
但是如果对 a.checkName方法重新定义的话,就不再指向checkObject.prototype.checkName。
上面使用prototype原型声明方法的方式要将prototype写很多遍,可以直接使用以下这种写法
var checkObject = function(){}
// 直接使用prototype对象
checkObject.prototype = {
checkName:function(){
console.log(‘checkName’)
},
checkEmail:function(){},
checkPassword:function(){},
}
但是两种方法不能够混用,否则如果将prototype对象赋值新对象的时候就会将原来的通过 prototype. 方式复制的方法覆盖。
上面使用的prototype原型可以在类上一次性定义多个原型方法,并且被通过new创建的对象继承,但是在使用的时候仍然还需要多次书写对象本身(比如1.5中的a)。但是这是可以避免的,只要在声明的每一个方法的末尾处将当前的对象返回,在JavaScript中this指向的就是当前对象,所以我们可以将它返回。改动如下:
1.8 定义一个可以为函数添加多个方法的addMethod()方法
前面提到可以在函数对象中通过原型对象prototype收编多个变量函数,那么Function作为函数的祖先是否也可以呢?
从上面的代码和控制台结果可以知道,Function也可以通过prototype收编变量函数,但是如果按照这种方法频繁的添加,会导致每个函数都有这些方法,从而造成不必要的开销。所以我们可以在原生对象Function上添加一个添加方法的功能方法。
1.9 定义一个既可以为函数原型添加多个方法也可以为自身添加多个方法的addMethod()方法
分享
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
每个函数都有这些方法,从而造成不必要的开销。所以我们可以在原生对象Function上添加一个添加方法的功能方法。
1.9 定义一个既可以为函数原型添加多个方法也可以为自身添加多个方法的addMethod()方法