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,构造函数不需要返回对象引用,它是后台自动返回的