JavaScript面向对象的编写方式
JavaScript面向对象有两种方式(面向对象其实就是封装,继承,多态。我对面向对象的理解还有一种,前端就是原型,后端就是框架)
1.工厂模式(缺点,只有一个new,所有对象具有相同的方法)
function fn(a, b) { //创建原料 var obj = newObject(); //加工产品 obj.name = name; obj.yongchu = function() { alert("obj的用途是XXX"); } //产品出厂 return obj; } var obj = fn("one","eat"); //没有new关键字 var obj2 = fn("two","eat"); obj.yongchu(); alert(obj.yongchu == obj2.yongchu); //false 功能一样却不相等,同样功能占用了更多的内存,浪费。
2.原型对象
实现方法:由构造函数和原型组成,构造函数里写对象的属性,原型里写对象的方法。使用时,先实例化构造函数(js没有类)得到原型对象(构造对象),再调用原型方法。
function CreatePerson(name, qq) { //构造函数里面写属性,类名CreatePerson首字母大写 this.name = name; this.qq = qq; } createPerson.prototype.showName = function() { //原型里面写方法 alert("我的名字" + this.name); } createPerson.prototype.showQQ = function() { alert("我的QQ" + this.qq); } var obj = new createPerson("mike", "123456"); obj.showName(); obj.showQQ();
原型对象之间可以通过call(this,属性)方法继承构造对象中的属性,可以通过原型重新指向构造对象(之前的原型方法没有了)来继承原型方法(继承了新的原型方法),相当于修改了构造函数。继承之后,原型对象之间会形成内置的__porto__原型链,比如下面,A构造的B的原型,A是上级,B是下级。注意:constructor的值是一个函数,比如String(),Function()等
function A(x){ this.x = x; } A.prototype.a ="a"; function B(x,y){ this.y = y; A.call(this,x); } B.prototype.b1 =function(){ alert("b1"); } 方法1: B.prototype =new A(); B.prototype.b2 =function(){ //注意这步是定义B原型的方法,不会影响A原型 alert("b2"); } var obj =new B(1,3); 方法2: B.prototype = A.prototype B.prototype.b2 = function(){ //注意这步是定义B原型的方法,会影响A原型 alert("b2"); } var obj = new B(1,3);
还可以还原B的构造函数,这样就又具有原来的原型方法b1。所有原型对象中每个对象可以具有不同的方法
B.prototype.constructor = B;

浙公网安备 33010602011771号