JavaScript高级——创建对象(3)

创建对象

简单方式

我们可以直接通过 new Object() 创建:

var person = new Object()
person.name = 'Jack'
person.age = 18

person.sayName = function () {
  console.log(this.name)
}

每次创建通过 new Object() 比较麻烦,所以可以通过它的简写形式对象字面量来创建:

var person = {
  name: 'Jack',
  age: 18,
  sayName: function () {
    console.log(this.name)
  }
}

对于上面的写法固然没有问题,但是假如我们要生成两个 person 实例对象呢?

var person1 = {
  name: 'Jack',
  age: 18,
  sayName: function () {
    console.log(this.name)
  }
}

var person2 = {
  name: 'Mike',
  age: 16,
  sayName: function () {
    console.log(this.name)
  }
}

通过上面的代码我们不难看出,这样写的代码太过冗余,重复性太高。

简单方式的改进:工厂函数

我们可以写一个函数,解决代码重复问题:

function createPerson (name, age) {
  return {
    name: name,  //name 和 age等于传过来的参数
    age: age,
    sayName: function () {
      console.log(this.name)  //this指向当前创建的对象
    }
  }
}

然后生成实例对象:

var p1 = createPerson('Jack', 18)
var p2 = createPerson('Mike', 18)

这样封装确实爽多了,通过工厂模式我们解决了创建多个相似对象代码冗余的问题,

但却没有解决对象识别的问题(即怎样知道一个对象的类型)。

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  <script>
    // 1  new Object()
    // var hero = new Object();  // 空对象
    // hero.blood = 100;
    // hero.name = '刘备';
    // hero.weapon = '剑';

    // hero.attack = function () {
    //   console.log(this.weapon + ' 攻击敌人');
    // }

    // 2 对象字面量
    // var hero = {};   // 空对象
    // var hero1 = {
    //   blood: 100,
    //   name: '刘备',
    //   weapon: '剑',
    //   attack: function () {
    //     console.log(this.weapon + ' 攻击敌人');
    //   }
    // }

    // // hero.attack();
    // var hero2 = {
    //   blood: 100,
    //   name: '关羽',
    //   weapon: '刀',
    //   attack: function () {
    //     console.log(this.weapon + ' 攻击敌人');
    //   }
    // }
    // 
    // 3 工厂函数 创建多个对象
    function createHero(name, blood, weapon) {
      var o = new Object();
      o.name = name;
      o.blood = blood;
      o.weapon = weapon;
      o.attack = function () {
        console.log(this.weapon + ' 攻击敌人');
      }
      return o;
    }

    var hero = createHero('刘备', 100, '剑');
    var hero1 = createHero('关羽', 100, '刀');
    // console.log(typeof hero);
    console.log(hero instanceof createHero);


    var arr = [];
    console.log(arr instanceof Array);
  </script>
</body>

</html>

在这里插入图片描述

工厂函数生产出来的我们只知道它是一个对象,我们用instanceof判断一种复杂类型,检测数组对象返回true表示arr是一个数组对象,但是我们想知道生产出的具体是一个妖怪还是一个英雄是不知道的,所以就引出了构造函数,构造函数是一种聪明的工厂函数,我们可以用其instanceof来检测,下一节讲解
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值