JavaScript

| 自定义 JavaScript 对象的方式

2019-08-04  本文已影响0人  Hemingway_AT

JavaScript的数据类型分为简单类型和复杂类型,作为复杂类型的对象是业务代码的基础。本篇介绍定义JS对象的方式,比较全了。目录如下:

一、直接实例模式

var p = {
    name: 'Mary',
    age: 18,
    desc: function(){
        document.write(this.name + ' is ' + this.age);
    }
};

p.desc();// Mary is 18
var p = new Object();
p.name = 'Mary';
p.age = 20;
p.desc = function(){
    document.write(this.name + ' is ' + this.age);
};
        
p.desc();// Mary is 20

通过new创建的实例,支持增添键值对,完善属性定义。

二、构造函数模式

function Person(name, age){
    this.name = name;
    this.age = age;
    this.desc = function(){
        document.write(this.name + ' is ' + this.age);
    };
}
        
var p = new Person('Mary', 22);
p.desc();// Mary is 22
var p2 = new Person('Peter', 18);
p2.desc();// Peter is 18

通过传参,可初始化差异性的实例。然而,每一个实例是独特的;每创建一个Person实例,就会创建一个desc方法,而这个一致的方法并不需要重复创建。

三、原型模式

function Person(){
}// 构造函数

Person.prototype.name = 'Mary';
Person.prototype.age = 24;
Person.prototype.desc = function(){
    document.write(this.name + ' is ' + this.age);
};
            
var p = new Person();
p.desc();// Mary is 24
var p2 = new Person();
p2.desc();// Mary is 24

代码效率高,但是原型中的属性被所有实例共享,意味着所创建出来的对象千篇一律。

四、组合模式(构造函数模式&原型模式)

function Person(name, age){
    this.name = name;
    this.age = age;
}// 构造函数

Person.prototype.desc = function(){
    document.write(this.name + ' is ' + this.age);
};
            
var p = new Person('Mary', 26);
p.desc();// Mary is 26
var p2 = new Person('Peter', 20);
p2.desc();// Peter is 20

组合模式,继承了单一构造函数和原型模式的优点:构造函数灵活初始化实例属性,原型则用来定义公共方法。

五、动态原型模式

function Person(name, age){
    this.name = name;
    this.age = age;
    if(! Person.prototype.desc){// 为了使desc函数不重复定义
        Person.prototype.desc = function(){
            document.write(this.name + ' is ' + this.age);
        };
    }
}

var p = new Person('Mary', 28);
p.desc();// Mary is 28

构造函数模式和原型模式的另一种组合形式,即在构造函数中初始化原型。这种把所有信息都封装在了构造函数中的写法,是不是和其他面向对象语言(如Java)的写法更像呢!

六、工厂模式

function createPerson(name, age){
    var p = new Object();
    p.name = name;
    p.age = age;
    p.desc = function(){
        document.write(this.name + ' is ' + this.age);
    };
    return p;
}
            
var p = createPerson('Mary', 30);
p.desc();// Mary is 30

对外屏蔽对象实例化过程。通过传参,在工厂方法里面,显示地创建对象并实例化返回。

(完)

上一篇 下一篇

猜你喜欢

热点阅读