构造函数
对象中的属性,如果是一个函数,也称该属性为对象的方法
用于创建对象的函数
用函数创建对象,可以减少繁琐的对象创建流程
函数返回一个对象
js// 创建一个用户 function createUser(name, age, gender) { return { name, age, gender, sayHello() { console.log(`我叫${this.name},年龄${this.age}岁,性别${this.gender}`); } }; } var u1 = createUser("张三", 18, "男"); u1.sayHello(); var u2 = createUser("姬成", 20, "男"); u2.sayHello(); console.log(u1 === u2);构造函数:构造函数专门用于创建对象
js
new 函数名(参数);如果使用上面的格式创建对象,则该函数叫做构造函数。
- 函数名使用大驼峰命名法
- 构造函数内部,会自动创建一个新对象,this指向新创建的对象,并且自动返回新对象
- 构造函数中如果出现返回值,如果返回的是原始类型,则直接忽略;如果返回的是引用类型,则使用返回的结果
- 所有的对象,最终都是通过构造函数创建的
js
// 创建一个用户
function User(name, age, gender) {
this.name = name;
this.age = age;
this.gender = gender;
this.sayHello = function() {
console.log(`我叫${this.name},年龄${this.age}岁,性别${this.gender}`);
}
}
var u1 = new User("张三", 18, "男");
u1.sayHello();
var u2 = new User("姬成", 20, "男");
u2.sayHello();
console.log(u1 === u2);new.target
该表达式在函数中使用,返回的是当前的构造函数。
但是,如果该函数不是通过new调用的,则返回undefined
通常用于判断某个函数是否是通过new在调用。
js
// 创建一个用户
function User(name, age, gender) {
var temp = function() {
console.log(`我叫${this.name},年龄${this.age}岁,性别${this.gender}`);
};
if (new.target === User) {
//正常的构造函数调用
this.name = name;
this.age = age;
this.gender = gender;
this.sayHello = temp;
} else {
return {
name,
age,
gender,
sayHello: temp
}
}
}
var u1 = new User("ss", 18, "女");
console.log(u1);练习-英雄打怪兽
英雄打怪兽的小游戏
英雄和怪兽都具有攻击力、防御力、生命值、暴击几率(暴击时伤害翻倍)
攻击伤害 = 攻击力 - 防御力
伤害最少为1.
创建一个英雄和一个怪兽,让它们互相攻击,直到一方死亡,输出整个攻击过程。
js
/**
* 游戏角色的构造函数
* @param {*} name 角色名
* @param {*} attack 攻击力
* @param {*} defence 防御力
* @param {*} hp 声明值
* @param {*} critRate 暴击率(0~100)
*/
function Charactor(name, attack, defence, hp, critRate) {
this.name = name;
this.attack = attack;
this.defence = defence;
this.hp = hp;
this.critRate = critRate;
//函数
/**
* 打印信息
*/
this.print = function () {
console.log(`${this.name}\t生命:${this.hp}\t攻击:${this.attack}\t防御:${this.defence}\t暴击率:${this.critRate}%`);
}
/**
* 攻击,返回对方是否死亡
* @param {*} ctor 攻击对象
*/
this.hit = function (ctor) {
var damage = this.attack - ctor.defence;
//判断是否有暴击
var rate = this.critRate / 100;
var rad = Math.random();
var isCrit = false; //是否暴击
if (rad <= rate) {
isCrit = true;
//有暴击
damage *= 2; //伤害翻倍
}
//伤害至少为1
if (damage < 1) {
damage = 1;
}
ctor.hp -= damage;
if (ctor.hp < 0) {
ctor.hp = 0;// 血量至少为0
}
console.log(`${isCrit ? "暴击!" : ""}【${this.name}】攻击【${ctor.name}】,造成【${damage}】点伤害,对方当前血量为【${ctor.hp}】`);
//对方是否死亡
return ctor.hp === 0;
}
}
//主程序
var hero = new Charactor("成哥", 100, 20, 500, 30);
hero.print();
console.log("VS");
var monster = new Charactor("邓哥", 120, 40, 400, 5);
monster.print();
while (true) {
if (hero.hit(monster)) {
break;
}
if (monster.hit(hero)) {
break;
}
}
console.log("=========================");
hero.print();
monster.print();
console.log("游戏结束");