因为类里面的方法都是通过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()方法