需求
- 创建一张扑克牌 记录:点数,花色,打印函数
- 创建一副扑克牌 包含:52张扑克牌的数组, 遍历打印扑克牌的函数
扑克牌 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 关键字来调用一个构造函数时,它会执行以下步骤:
- 创建一个新的空对象。
- 将这个空对象的原型指向构造函数的 prototype 属性。
- 将这个空对象赋值给构造函数内部的 this 关键字。
- 开始执行构造函数内部的代码。
因此,当我们使用 new 关键字来调用一个构造函数时,构造函数内部的 this 指向的是一个新生成的空对象。所有针对 this 的操作都会发生在这个空对象上。如果构造函数内部有 return 语句,且 return 后面跟着一个对象,new 命令会返回 return 语句指定的对象;否则,就会返回这个新生成的空对象。