javascript面向对象
面向对象是一种思想。世间万物皆对象。
javascript面向对象
面向对象编程,就使用面向对象的思想去写代码。相较于面向过程的编程,更抽象,代码复用率更高。
var obj1=new Object();
obj1.name='张三';
obj1.showName=function(){
alert(this.name);
}
这就是一个最简单的面向对象的程序。obj1是一个Object对象,name和showName()分别是obj1下面的属性和方法。
工厂模式
function person(name,age){
var o=new Object();
o.name=name;
o.age=age;
o.showName=function(){
alert(this.name);
}
return o;
}
var P1=person("张三","22");
P1.showName();
工厂模式虽然使代码的复用率提高了,但是,工厂模式也有一个最致命的问题,即没有办法识别谁是谁的对象,都是object对象。
构造函数模式
function Person(name,age){
this.name=name;
this.age=age;
this.showName=function(){
alert(this.name);
}
}
var P1=new Person("张三","22","男");
P1.showName();
注:当new创建一个函数时,这时候函数中的this就是所创建的对象,而且函数的返回值直接就是this(隐式返回)。
构造函数模式需要经过四个步骤。
1.创建一个新对象
2.将构造函数的作用域给了新对象(this指向新对象)
3.为新对象添加属性
4.返回新对象
创建自定义构造函数意味着可以把它的实例标识为一种特定的类型。这正是工厂模式无法做到的。
然而,构造函数模式也存在着一些问题。每当调用这个函数,新创建出一个对象实例时,都会把Person对象下面的showName()方法重新创建一边。很耗内存。
构造函数模式与原型模式混合使用
function Person(name,age){
this.name=name;
this.age=age;
}
Person.prototype.showName=function(){
alert(this.name);
}
var P1=new Person("张三","22","男");
P1.showName();
这种模式,通过构造函数创建属性,通过原型创建方法,使每个实例的属性均不同,方法却是同一个,大大提高了性能,叫小了损耗。
原型
hasOwnProperty()
,看是不是对象自身下面的属性。是原型属性,返回false;实例属性,返回true。
constructor
,查看对象构造函数。默认,系统总会有一句P1.prototype.constructor=P1;
,当执行某些操作时,会修改对象的constructor属性,此时要手动修改回来。