JavaScript 构造函数创建一副Pocker

39 阅读2分钟

需求

  1. 创建一张扑克牌 记录:点数,花色,打印函数
  2. 创建一副扑克牌 包含:52张扑克牌的数组, 遍历打印扑克牌的函数

image.png 扑克牌 52张,

创建一张扑克牌

function Pocker(number, color) {
	this.number = number;
	this.color = color;
	this.print = function () {
		let numbers = ['A', 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13];
		let colors = ['黑桃', '方块', '红心', '梅花'];
		let color = colors[this.color - 1];
		let number = numbers[this.number - 1];
		if (number === 14) {
			console.log('jocker');
			return;
		}
		if (number === 15) {
			console.log('jocker');
			return;
		}
		console.log(number, color);
	};
}

构造函数接受两个参数, 第一个 number 第二个 color, 返回的this 有两个属性,和一个函数 print

this.print

通过表驱动的方法,将参数number, 映射成为数组, 使用者只关心传来的number(1~13),

colors 同理, color 参数会被识别为 colors 中的一项

特殊处理了大小王, 大小为没有花色,直接打印jocker || JOCKER

创建一副扑克牌

function Deck() {
	this.pockers = []; //扑克牌数组
	for (let i = 1; i <= 13; i++) {
		for (let j = 1; j <= 4; j++) {
			this.pockers.push(new Pocker(i, j));
		}
	}
	this.pockers.push(new Pocker(14, 0));
	this.pockers.push(new Pocker(15, 0));
	this.print = function () {
		this.pockers.forEach((item) => {
			item.print();
		});
	};

构造函数 Deck 返回一个扑克牌的数组和遍历扑克数组的函数 this.print

优化

我们可以将 Pocker 构造函数中的 print 方法移动到它的原型上,这样所有的 Pocker 实例都可以共享这个方法,而不是每个实例都有一个自己的 print 方法。这样可以节省内存并提高性能

function Pocker(number, color) {
	this.number = number;
	this.color = color;
}

Pocker.prototype.print = function () {
	let numbers = ['A', 2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K'];
	let colors = ['黑桃', '方块', '红心', '梅花'];
	let color = colors[this.color - 1];
	let number = numbers[this.number - 1];
	if (number === 14) {
		console.log('jocker');
		return;
	}
	if (number === 15) {
		console.log('jocker');
		return;
	}
	console.log(number, color);
};

function Deck() {
	this.pockers = [];
	this.pockers.push(new Pocker(14, 0));
	this.pockers.push(new Pocker(15, 0));
	for (let i = 1; i <= 13; i++) {
		for (let j = 1; j <= 4; j++) {
			this.pockers.push(new Pocker(i, j));
		}
	}
}
Deck.prototype.print = function () {
	this.pockers.forEach((item) => {
		item.print();
	});
};

let deck = new Deck();
deck.print();

构造函数发生了什么

当我们使用 new 关键字来调用一个构造函数时,它会执行以下步骤: download.png

  1. 创建一个新的空对象。
  2. 将这个空对象的原型指向构造函数的 prototype 属性。
  3. 将这个空对象赋值给构造函数内部的 this 关键字。
  4. 开始执行构造函数内部的代码。

因此,当我们使用 new 关键字来调用一个构造函数时,构造函数内部的 this 指向的是一个新生成的空对象。所有针对 this 的操作都会发生在这个空对象上。如果构造函数内部有 return 语句,且 return 后面跟着一个对象,new 命令会返回 return 语句指定的对象;否则,就会返回这个新生成的空对象。

image.png