Skip to content

构造函数

对象中的属性,如果是一个函数,也称该属性为对象的方法

用于创建对象的函数

用函数创建对象,可以减少繁琐的对象创建流程

  1. 函数返回一个对象

    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);
  2. 构造函数:构造函数专门用于创建对象

js
new 函数名(参数);

如果使用上面的格式创建对象,则该函数叫做构造函数。

  1. 函数名使用大驼峰命名法
  2. 构造函数内部,会自动创建一个新对象,this指向新创建的对象,并且自动返回新对象
  3. 构造函数中如果出现返回值,如果返回的是原始类型,则直接忽略;如果返回的是引用类型,则使用返回的结果
  4. 所有的对象,最终都是通过构造函数创建的
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("游戏结束");

MIT License