JS从0开始(八)对象、构造函数

323 阅读3分钟

一. 对象

对象内的函数叫做方法,写在外部的函数叫做函数
对象删除方法时不能写括号:

   <script>
        var obj = {
            name: 'a',
            teach: function () {
                console.log("aa");
            }
        }
        delete obj.teach;
        console.log(obj);
    </script>

delete obj.teach; 后面不需要加(),加了括号会自动执行造成删不掉,输出时还能看见。

二 . indexOf()、splice()

1.indexOf():返回某个指定的字符串值在字符串中首次出现的位置。 如果没有找到匹配的字符串则返回 -1。

2.splice() 方法用于添加或删除数组中的元素。如splice(2,1):从数组第二个开始删除一个元素

实例:学生上课报道系统 , 到6个人就输出到齐

  <script>
    var attendance = {
      student: [],
      total: 6,
      join: function (name) {
        this.student.push(name);
        if (this.student.length === this.total) {
          console.log(name + "到课,学生已到齐");
        } else {
          console.log(name + '到课,学生未到齐');
        }
      },
      leave: function (name) {
        var idx = this.student.indexOf(name);
        if (idx !== -1) {
          this.student.splice(idx, 1);
        }
        console.log(name + "早退");
        console.log(this.student);
      },
      classOver: function(){
        this.student = [];
        console.log("已下课");
      }
    }
    attendance.join("张三");
    attendance.join("李四");
    attendance.join("王五");
    attendance.join("赵六");
    attendance.join("吴七");
    attendance.join("孙八");
    attendance.leave("李四");
    attendance.classOver();
  </script>

三.创建对象的方式

1. 对象字面量

对象字面量只是JS中一种创建对象的方法

var obj = {
 name:"张三",
 sex:"male"
}
obj.name = "李四"

声明了一个变量(obj)   将一个对象({name:... ,})   赋值给变量(obj),这种方式称之为对象字面量(或者叫对象直接量)

2.构造函数

用系统内自带的构造函数,通过new关键字去实例化一个对象
用系统内置的new Object()来创建一个对象;
对象是通过实例化构造函数而构造的一个对象实例

var obj = new Object();
obj.name = "张三"
/用这样的方式给它添加属性

2.1自定义构造函数

和构造函数不同,在对象领域里面 使用键值对、用逗号分隔开来

var teacher ={
 name = "张三",
 say: function(){
  console.log(this.name);
 }
}

2.2 构造函数的 格式

<script>
function Teacher(){ //为了和普通函数区分,只有它唯一使用大驼峰
this.name = "张三";
this.sex = "男";
this.smoke = function(){
  console.log(I am smoking);
}
}

/这个构造函数执行之前 this不存在  所以说this此时没生成
/为了让this存在 必须要实例化它:
var teacher = new Teacher();
console.log(teacher);

</script>

2.3 构造工厂

我们通过构造函数创建出来的对象是互不影响的

<script>
function Teacher(){ //为了和普通函数区分,只有它唯一使用大驼峰
this.name = "张三";
this.sex = "男";
this.smoke = function(){
  console.log(I am smoking);
}
}

var teacher1 = new Teacher();
var teacher2 = new Teacher();
teacher1.name = "李四"
console.log(teacher1,teacher2);//输出 李四   张三
</script>

构造函数就相当于一个模板工厂,我们通过模板工厂,创建一辆又一辆的车
我们通过构造函数实例化一个对象就相当于 我们通过构造工厂创建了teacher1、teacher2这两个人。
当给teacher1改名字时,不影响teacher2 。 因为他们是互不相干的两个对象

2.4 构造函数传递实参

 <script>
  
function Teacher(name,sex,weight,course){ /形参
this.name = name;                   / this.name = 参数name
this.sex = sex;
this.weight = weight;
this.course = course
this.smoke = function(){
 this.weight--;
 console.log(this.smoke);
}
}
var teacher1 = new Teacher("张三","男","145","JS"); /输入实参
var teacher2 = new Teacher("李四","女","90","HTML");

console.log(teacher1,teacher2);//输出两个老师的对象信息 

</script>

也可以这样写:

 <script>
function Teacher(opt) {
    this.name = opt.name;
    this.sex = opt.sex;
    this.weight = opt.weight;
    this.course = opt.course
    this.smoke = function () {
      this.weight--;
      console.log(this.smoke);
    }
  }
  var teacher1 = new Teacher({
    name: "张三",
    sex: "男",
    weight: "145",
    course: "JS"
  });
  var teacher2 = new Teacher({
    name: "李四",
    sex: "女",
    weight: "90",
    course: "HTML"
  });
console.log(teacher1, teacher2);//输出两个老师的对象信息 
</script>

这样的写法就是目前的插件写法如Vue
自己创建一个插件如01.js 里面写:

function Teacher(opt) {
   this.name = opt.name;
   this.sex = opt.sex;
   this.weight = opt.weight;
   this.course = opt.course
   this.smoke = function () {
     this.weight--;
     console.log(this.smoke);
   }
 }

然后我们在自己的页面里面写:

var teacher1 = new Teacher({
   name: "张三",
   sex: "男",
   weight: "145",
   course: "JS"
 });
 
 var teacher2 = new Teacher({
   name: "李四",
   sex: "女",
   weight: "90",
   course: "HTML"
 });
console.log(teacher1, teacher2);//输出两个老师的对象信息 

实战

1.

写个构造函数:接收数字类型的参数,参数数量不定,完成参数相加和相乘的功能

 function Test(opt) {
          var args = arguments;
          this.add = function () {
              var sum = 0;
              for (var i = 0; i < args.length; i++) {
                  sum = sum + args[i];                                             
              }
              console.log(sum);
          },
              this.mul = function () {
                  var a = 1;
                  for (var i = 0; i < args.length; i++) {
                      a = a * args[i];

                  }
                  console.log(a);
              }
      }

      var test = new Test(2, 2, 3);
      test.add();
      test.mul();

2.

写一个构造车的函数:可设置车的品牌、颜色、排量,再写一个构造消费者的函数,设置用户的名字、年龄、收入,通过选择的方法实例化该用户喜欢的车,再设置车的属性。


      function Car(opt) {
          this.color = opt.color;
          this.brand = opt.brand;
          this.displacement = opt.displacement;
      }
      function Consumer(opt) {
          this.name = opt.name;
          this.age = opt.age;
          this.income = opt.income;
          this.selectCar = function () {
              var myCar = new Car({
                  color: "红色",

              });
              console.log(this.age + "岁的" + this.name + '买了一辆颜色为' + myCar.color + "的车");
          }
      }
      var James = new Consumer({
          name: "James",
          age: "20",

      })
      James.selectCar();