学习js一段时间以来,在网上没有找到比较系统的关于js面向对象方面的文章,故有感而发写此博文,供你们分享。注:本文章很大部分参考的张龙老师的资料,在此先感谢他,我只是作个总结而已。java
一对象的建立设计模式
1.基于已有对象的扩充数组
var object = new Object(); object.name = "jason"; object.fn = function() { alert(this.name); }
这种方式最不推荐了,除非临时须要用到对象,由于它根本失去了面向对象的特性。
2工厂方式app
function createObject(name,age)//工厂方法,用于建立对象 { var obj = new Object(); obj.name = name; obj.age =age; obj.fn = function() { alert("name="+this.name+"; age="+this.age); } return obj; } var obj1 = createObject("jason",21); var obj2 = createObject("jack",20); obj1.fn(); obj2.fn();
这种方式应用工厂方法的设计模式建立对象,可是有两大不足之处:(1)每一个工厂方法所建立的对象都会拥有一份本身的fn方法,而这个方法的代码是重复的,于是比较占用内存引发资源浪费;(2)建立对象的方式其实就调用方法而已,未用new关键字来建立,熟悉java、C++面向对象的朋友们都会感受别扭。所以也不推荐使用.
3.原形方式函数
function Person() { } Person.prototype.name = new Array("jason"); Person.prototype.age = 21; Person.prototype.fn= function() { alert("name= "+this.name+" ;age="+this.age); } var p1 = new Person(); var p2 = new Person(); p2.name.push("jack"); //用原形方式其实全部对象共享的属性的,全部对 //象的name属性指向同一份数组对象了,所以对p2name属性的修改会影响的p1 的name属性的 p1.fn(); p2.fn();
运行结果以下:
4.构造函数+原形的方式学习
function Person(name,age) { this.name = name; this.age = age; if(typeof Person.isFirst == "undefined") { Person.prototype.fn = function()//为Person的原形添加fn属性(函数能够做为对象的属性的) { alert("name="+this.name+";age="+this.age); } } Person.isFirst = true;//建立了一个对象后将其设为true,就 //不会执行上面的if语句,从而保证全部对象共享一份fn方法代码 } var p1 = new Person("jason",21); var p2 = new Person("jack",20); p1.fn(); p2.fn();
这种方式经过一个标准变量isFirst 来判断是否是用该“类”建立的第一个对象,从而保证了全部对象共享一份方法代码,用new关键字来建立对象使人如见故友
二继承this
1.对象冒充、2.call()和apply()方式、3.原形链方式spa
function Parent(name) { this.name = name; this.sayName =function() { alert("hi my name is "+name); }; } function Child(name,age) { this.parent = Parent;//这三条语句是用的对象冒充实现继承的 this.parent(name);// delete this.parent;//
// Father.call(this,name);//用call方法实现继承,能够替代上面的三句
// Father.cpply(this,[name]);//用apply方法实现继承,能够替代最上面的上面的三句 // Child.prototype = new Fahter();//用原形链方法实现继承,能够替代最上面的上面的三句,不过这里的name要另外赋值了
this.age = age;
this.sayAge=function()
{
alert("hi my name is "+name+" and my age is "+age);
};
}
var p = new Parent("father");
var c = new Child("son",18);
p.sayName();//father
c.sayName();//son
c.sayAage();//18