对象字面量
var person = {
"name":"Xiaoming",
"age":100,
"sex":"male",
"selfIntro":function(){
console.log("My name is "+this.name+" and I am "+age+" years old");
}
};
动态绑定
var oCar = new Object;
oCar.color = "blue";
oCar.doors = 4;
oCar.mpg = 25;
oCar.showColor = function() {
alert(this.color);
};
工厂函数
- 基于对象字面量和动态绑定编写一个创建对象的函数,从而实现批量创建对象。但是如果对象中有函数的话,可能会减少一定的性能,因为每个对象都存储了一份函数。
function createCar() {
var oTempCar = new Object;
oTempCar.color = "blue";
oTempCar.doors = 4;
oTempCar.mpg = 25;
oTempCar.showColor = function() {
alert(this.color);
};
return oTempCar;
}
var oCar1 = createCar();
var oCar2 = createCar();
构造函数
- 创建多个对象。具体对于函数来说是只存储一份还是存储多份不清楚。
function Car(sColor,iDoors,iMpg) {
this.color = sColor;
this.doors = iDoors;
this.mpg = iMpg;
this.showColor = function() {
alert(this.color);
};
}
var oCar1 = new Car("red",4,23);
var oCar2 = new Car("blue",3,25);
基于原型
- 利用了prototype属性,使用该属性添加的对象都只有一份,类似静态变量。也就是说只能生成属性值相同的对象。就算是后续对一个对象的属性进行修改,那么其他的对象的该属性也会被改变。
function Car() {
}
Car.prototype.color = "blue";
Car.prototype.doors = 4;
Car.prototype.mpg = 25;
Car.prototype.drivers = new Array("Mike","John");
Car.prototype.showColor = function() {
alert(this.color);
};
var oCar1 = new Car();
var oCar2 = new Car();
oCar1.drivers.push("Bill");
alert(oCar1.drivers); //输出 "Mike,John,Bill"
alert(oCar2.drivers); //输出 "Mike,John,Bill"
构造函数 + 基于原型
- 各取优势。将每个对象的不同的变量存放到构造函数中,将函数或者静态变量使用prototype来生成。
function Car(sColor,iDoors,iMpg) {
this.color = sColor;
this.doors = iDoors;
this.mpg = iMpg;
this.drivers = new Array("Mike","John");
}
Car.prototype.showColor = function() {
alert(this.color);
};
var oCar1 = new Car("red",4,23);
var oCar2 = new Car("blue",3,25);
oCar1.drivers.push("Bill");
alert(oCar1.drivers); //输出 "Mike,John,Bill"
alert(oCar2.drivers); //输出 "Mike,John"
动态的基于原型
- 构造函数+基于原型的理念已经很好了,但是这样会导致代码的分散。
- 使用_initialized该方法判断构造函数Car是否被初始化,如果已经被初始化,那么不需要再添加函数或静态变量。如果未被初始化,那么使用prototype来添加函数或静态变量。
function Car(sColor,iDoors,iMpg) {
this.color = sColor;
this.doors = iDoors;
this.mpg = iMpg;
this.drivers = new Array("Mike","John");
if (typeof Car._initialized == "undefined") {
Car.prototype.showColor = function() {
alert(this.color);
};
Car._initialized = true;
}
}
使用class关键字
- 内部实现原理为构造函数+基于原型。但是有小小的不同,类省略了构造函数的某些属性。例如arguments和caller属性。
- 还引入了static关键字,用于实现类函数。
class User {
constructor(name) {
this.name = name;
}
sayHi() {
alert(this.name);
}
}
let user = new User("John");
user.sayHi();