构造器模式

2017-04-30  本文已影响24人  pws019

constructor pattern


在传统的面向对象编程语言中,构造函数经常用来初始化已经被分配内存的新的对象。在js中,一切皆对象,我们通常对对象的构造函数比较感兴趣。

对象的构造函数常常用来创建指定类型的对象————当对象第一次被创建的时候,这个对象通过构造函数,接受用户参数,设置其内部的属性和方法。

对象的创建通常有三种方法

//等于 new Object();
var newObject = {};

//ES5的新语法,create接受两个参数,第一个问要继承的对象,没有传null,第二个为对象的属性描述符,例如读写权限等.
var newObject = Object.create(Object.prototype);

//根据传入的参数得到指定的对象,如果没传则得到一个单纯的对象。
var newObject = new Object();
// new Object({x:1,y:2}) => {x:1,y:2}
// new Object(function(a){this.x = a}) => function(a){this.x=a}
// new Object(1) =>new Number(1)

//这里有四种方式给对象赋值

//ES3
//1. “.”语法
newObject.someKey = "hello world";
var value = newObject.someKey;

//2.方括号语法[];
newObject['someKey'] = 'Hello world';
var value = newObject["someKey"];

//3.ES5写法
Object.defineProperty(newObject,"someKey",{
    value:"form more control of the proerty's behavior",
    writable:true,
    enumerable:true,
    configurable:true
})

//如果上面这种写法比较麻烦的话,可以定义一个函数
var defineProp = function(obj,key,value){
    var config = {
        value:value,
        writable:true,
        enumerable:true,
        configurable:true
    };
    Object.defineProperty(obj,key,config);
}
//如果我们想创建一个“人”的对象
var person = Object.create(Object.prototype);
defineProp(person,"car","Delorean");
defineProp(person,"dateOfBirth","1981");
console.log(person);
//=> Object {car: "Delorean", dateOfBirth: "1981", hasBeard: false}

// 4. Object.defineProperties
// 一次设置多个属性。
Object.defineProperties( newObject, {
    "someKey": {
        value: "Hello World",
        writable: true
    },
    "anotherKey": {
        value: "Foo bar",
        writable: false
    }
});

基本的构造函数

在早期js不支持类的概念,但是支持为对象指定构造函数
通过简单的在构造函数调用前加上一个new的关键词作为前缀。
可以告诉js,通过该函数实创建并例化一个对象。

在这个构造函数中,this表示当前正要实例化的对象。
再次来看一个对象的创建,一个基本的构造函数如下:

function Car( model, year, miles ) {

    this.model = model;
    this.year = year;
    this.miles = miles;

    this.toString = function () {
        return this.model + " has done " + this.miles + " miles";
    };
}


//用法:

// 我们可以创建并实例化一个car
var civic = new Car( "Honda Civic", 2009, 20000 );
var mondeo = new Car( "Ford Mondeo", 2010, 5000 );

// 并且调用该实例化对象的方法
console.log( civic.toString() );
console.log( mondeo.toString() );

以上是简单的构造函数模式,但是它仍然面临很多问题,
一是不利于继承
再一个便是每个实例都拥保留着一个同样的方法toString(),
这显然不是我们想要的,我们希望的是。更理想的做法是将方法共享到CarType实例之间

Constructors With Prototypes


Functions(函数),像js中所有对象一样,都有一个prototype(对象)属性,当我们调用构造函数
去创建一个新的对象时候,所有构造函数prototype对象上的属性,新对象都可以使用。
通过这种方式,所有的Car对象都可以通过连接相同的原型对象,被创建,上面的例子被修改后如下:

function Car( model, year, miles ) {

    this.model = model;
    this.year = year;
    this.miles = miles;

}

//在这里通过定义构造函数中的prototype属性,避免每个实例都拥重新定义这个属性。
Car.prototype.toString = function () {
    return this.model + " has done " + this.miles + " miles";
};

// 用法:
var civic = new Car( "Honda Civic", 2009, 20000 );
var mondeo = new Car( "Ford Mondeo", 2010, 5000 );

console.log( civic.toString() );
console.log( mondeo.toString() );
上一篇 下一篇

猜你喜欢

热点阅读