面向对象篇(四)
function CreatePerson(name){ this.name = name; this.showName = function(){ alert(this.name); } } var p1 =new CreatePerson('张三'); p1.showName(); //张三 var p2 =new CreatePerson('李四'); p2.showName(); //李四
上面的代码,看似没有什么问题,我们来看一个问题
console.log(p1.showName == p2.showName); //false
看似同样的一个方法,对比起来却是false,这是因为,方法也是对象,而对象之间的比较不仅仅是值相等,而且引用地址也要相同,这两个函数的比较之所以不相等,就是因为虽然值相等,但是引用地址不相等,那么这也就意味着,同样的一个方法,要在内存中存放两份,现在是两个如果是100个这样的方法呢,就会大大的消耗内存,那么怎么解决这种问题呢,这就要说到js中一个非常重要的概念------原型,即prototype,原型就可以解决这种问题,不管多少,内存中都存在一份,我们来看代码怎么写
function CreatePerson(name){ this.name = name; } CreatePerson.prototype.showName = function(){ alert(this.name); } var p1 =new CreatePerson('张三'); p1.showName(); //张三 var p2 =new CreatePerson('李四'); p2.showName(); //李四 console.log(p1.showName == p1.showName); //true;
我们看到原型prototype是挂载在构造函数下面的,把方法再挂载到原型下面,我们可以看到,这个时候p1.showName和p2.showName就已经相等了,返回了true,
这样我们就写出了一个完整的面向对象的程序。