js类的创建

对象字面量

  • 创建单个对象
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();
posted @ 2020-08-25 09:43  yangzixiongh  阅读(140)  评论(0编辑  收藏  举报