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;

 

posted @ 2018-02-06 13:51  wrpuser  阅读(202)  评论(0)    收藏  举报