Javascript面向对象编程--封装

Javascript是一种基于对象的语言,一切都是对象;但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class;

如果我们要把“属性”(property)和“方法”(method),封装成一个对象,甚至要从原型对象生成一个实例对象,我们应该怎么做呢?

一 , 生成对象的原始模式

     假定我们把box看成一个对象,它有“名字”和“颜色”等属性;

var box = {
    name : '',
    color : ''
  }

      根据这个原型对象的规格(schema),生成两个实例对象;

var box1 = {}; // 创建一个空对象
    box1.name = "大毛"; // 按照原型对象的属性赋值
    cat1.color = "黄色";
var box2 = {};
    box2.name = "二毛";
    box2.color = "黑色";

这就是最简单的封装,把两个属性封装在一个对象里面。但是,这样的写法有两个缺点,一是如果生成几个实例,写来就非常麻烦;二是实例与原型之间,没有任何方法可以看出有什么联系。

二 , 工厂模式

      工厂模式解决了代码重复实例化的问题

function creatObject(name,age){
        var obj = new Object();            //创建对象
        obj.name = name;             //添加属性
        obj.age = age;
        obj.run = function(){                 //添加方法
            return this.name + this.age +'运行中...';
        };
        return obj;                               //返回引用对象
    };
    var box1 = creatObject('lee',100);  //实例化
    var box2 = creatObject('jack',200);

    alert(box1.run());
    alert(box2.run());

这种方法的问题依然是,box1和box2之间没有内在的联系,不能反映他们是同一个原型对象的实例

三 , 构造函数模式

     为了解决从原型对象生成实例的问题,Javascript提供了一个构造函数(Constructor)模式。

     所谓"构造函数",其实就是一个普通函数,但是内部使用了this变量。对构造函数使用new运算符,就能生成实例,并且this变量会绑定在实例对象上。

function Box(name,age){     //创建一个对象,所有构造函数的对象其实就是Object
        this.name = name;        //添加属性
        this.age = age;
        this.run = function(){    //添加方法
            return this.name + this.age + '运行中...';
        };
    };
    var box1 = new Box('lee',100);  //实例化
    var box2 = new Box('jack',200);

    alert(box1.run());
    alert(box2.run());

    // 1,构造函数没有new Object,但它后台会自动var obj = new Object
    // 2,this就相当于obj
    // 3,构造函数不需要返回对象引用,它是后台自动返回的
原文地址:https://www.cnblogs.com/cbhello/p/3333432.html