0. Constructor(构造器)模式
在面向对象中,Constructor是一种在内存已经分配给该对象的情况下,用于初始化新创建对象的特殊方法。在JavaScript中,通常用object构造器。
Object构造器用于创建特定类型的对象——准备好对象以备使用。
接受构造器可以使用的参数,以在第一次创建对象时,设置成员变量和方法的值。
1.对象创建
1.1 JavaScript创建对象一般用如下两种方法:
// 创建空对象
var newObject1 = {};
// Object构造器
var newObject2 = new Object();
1.2 对象赋值
对象赋值一般有四种方法:
// 1."点"语法
// 设置属性
newObject.someKey = "asd";
//获取属性
var key = newObject.someKey;
// 2.中括号
//设置属性
newObject["someKey"] = "asd";
//获取属性
var key = newObject["someKey"];
// 3.Object.defineProperty
//设置属性
Object.defineProperty(newObject, "someKey", {
value:"for more control of the property's behavior",
writable: true,
enumerable: true,
econfigurable: true
});
// 简化
var defineProp = function(obj, key, value){
config.value = value;
Object.defineProperty(obj,key,config);
}
// e.g.
var person Object.create(null);
defineProp(person, "car", "myCar");
defineProp(person, "birth", "asd");
defineProp(person, "hasBeard", false);
// 4.Object.defineProperties
// 设置属性
Object.defineProperties(newObject, {
"someKey":{
value:"asd",
writable: true
},
"anotherKey": {
value:"qwe",
writable: true
}
});
1.3 继承
这些方法甚至是可以用于继承的
// 创建司机对象继承于person对象
var driver = Object.create(person);
// 设置司机的属性
defineProp(driver, "speed", "100kmh");
// 获取继承的属性
console.log(driver.birth);
// 获取新属性
console.log(driver.speed);
2. 基本Constructor(构造器)
通过在构造器前面加new关键字,实例化新对象,该对象成员由该函数定义。
在构造器内部,关键字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";
}
}
//创建实例
var c1= new Car("car1", "2016", 20000);
var c2 = new Car("car2", "2017", 1500);
//调用toString()查看输出
console.log(c1.toString());
console.log(c2.toString());
基本构造器存在一些问题,包括:
- 继承困难
- 其中的函数(比如toString)是为每个用Car构造器创建的新对象分别重新定义的,应该实现共享。
3. 带原型的(prototype)的Constructor(构造器)
JavaScript中的prototype(原型)属性,可以让JavaScript构造器创建一个对象后,新对象拥有构造器原型的所有对象。
这样,前文示例变为:
function Car(model, year, miles){
this.model = model;
this.year = year;
this.miles = miles;
};
Car.prototype.toString = function{
return this.model + " has done " + this.miles + " miles";
};
//创建实例
var asd = new Car("car1", "2016", 20000);
var qwe = new Car("car2", "2017", 1500);
//调用toString()查看输出
console.log(asd.toString());
console.log(qwe.toString());
此时,toString()的单一实例就能在所有的Car对象中共享。