【2021-09-13】JS学习(七)--面向对象程序设计

11.1 String类型

  • length属性 获取字符串的字符数量

  • charAt(i) 返回给定位置的字符

  • charCodeAt(i) 返回给定位置字符的编码

  • indexOf("x") 从前往后找, 查找指定字符所在位置 如果字符不存在,返回-1 有一个数字类型的可选参数,代表 从哪个位置开始查找

  • lastIndexOf("x") 从后往前找,查找字符所在位置

  • concat() 作用:将字符串进行拼接的方法,将一个或多个字符串拼接起来,返回值是新字符串,大部分情况使用 +去代替该方法

    调用者:str1

    参数:str2

    返回值:str1+str2

  • slice() 截取指定字符串 [start,end) 不改变原始值,所以注意使用新变量接受结果

  • substr()

    参数:开始位置from 截取长度length

    返回值:字符串

    不改变原始值

  • substring()

  • trim() 删除字符串前后空格

  • toUpperCase() 大写

  • toLowerCase() 小写

var s = "hello";
console.log(s.length);
console.log(s.charAt(1));
console.log(s.charCodeAt(1));
console.log(s.indexOf("q"));
console.log(s.LastIndexOf("e"));
console.log(s.indexOf("e",2));
​
var s2 = ",world";
console.log(s.concat(s2));//hello,world
var s = "helloworld";
console.log(var s1 =s.slice(3,7));//lowo
​
console.log(s.substr(3,7));//lowworld
​
var s = "helloworld";
console.log(s.substring(3,7));//lowo
​
var s = " hello world ";
console.log(s.trim());
​
var s = " hello world ";
console.log(s.toUpperCase());//HELLO WORLD 
​
var s = "HELLO WORLD"
console.log(s.toLowerCase());//hello world
 

11.2 Math对象

常用方法

Math.min() 作用:返回一组数中的最小值

Math.max() 作用:返回一组数中的最大值

console.log(Math.min(10,9,5,4,2,1,3,251));//1
console.log(Math.max(10,9,5,4,2,1,3,251));//251

Math. ceil() 向上舍入

Math. floor() 向下取舍

console.log(Math.ceil(10.41));//11
​
console.log(Math.floor(10.41));//10
console.log(Math.floor(10.91));//10

Math.round() 四舍五入

console.log(Math.round(10.91));//11
console.log(Math.round(10.41));//10

Math.random() 返回值是在(0,1)的一个随机数

console.log(Math.random());//随机数

其他方法

  • abs(num) 绝对值

  • exp(num) 返回值Math.E的num次幂

  • log(num) 返回num的自然对数

  • pow(num,power) 返回num的power次幂

  • .........

11.3 Date对象

方法

  • getFullYear() 年份

  • getYear()

  • getMonth() 月份 0-11

  • getDate() 返回 日期中对象的几号

  • getDay() 星期几 周日 0 周一--周六 1-6

  • getHours() 返回小时 0-23

  • getMinutes() 返回分钟数 0-59

  • getSeconds() 返回秒数 0-59

  • getMilliseconds() 返回毫秒数

  • getTime() 时间戳 1970-01-01 00:00:00到现在

  • toDateString()

  • toTimeString()

  • toISOString()

  • toJSON()

  • toString()

var str = "2021-09-02";
var date = new Date(str);
console.log(date);//当前标准时间
colsole.log(date.getFullYear());
console.log(date.getMonth());//console.log(date.getMonth() + 1);
console.log(date.getDate());
console.log(date.getDay());
console.log(date.getHours());
console.log(date.getMinutes());
console.log(date.getSeconds());
console.log(date.getMilliseconds());
​
console.log(date.getTime());
colsole.log(date.getYear());
console.log(date.valueOf());
​
console.log(date.toDateString());
console.log(date.toTimeString());
​
console.log(date.toISOString());
console.log(date.toJSON());
console.log(date.toString());

案例 日期:2021-09-02 10 :25 :40

console.log(dateFMT(new Date()));
function dateFMT (date) {
  // var date = new Date();
  var y = date.getFullYear();
  var m = date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1;
  var d = date.getDate().toString().padStart(2, "0");
  var hh = date.getHours().toString().padStart(2, "0");
  var mm = date.getMinutes().toString().padStart(2, "0");
  var ss = date.getSeconds().toString().padStart(2, "0");
  return y + "-" + m + "-" + d + " " + hh + ":" + mm + ":" + ss;
}
var moment = require("moment");
​
var date = new Date();
var result = moment(date).format("YYYY-MM-DD hh:mm:ss");
console.log(result);
​
var date = new Date();
console.log(date.getTime());
var thisTime = date.getTime()
var time = moment(thisTime).format("YYYY-MM-DD hh:mm:ss");
console.log(time);

11.4 工厂模式

因为使用普通的字面量创建多个对象时,会产生大量的重复代码,为了解决这个问题,我们引入工厂模式。

通过将创建对象的方法封装起来,避免重复代码产生。

function newPerson(name,age,gender){
    var p =new Object();
    p.name = name;                                                                      
    p.age = age;
    p.gender = gender;
    p.sayName = function(){
        console.log(this.name);
    }
}
var p1 = newPerson('zhangsan',12,'男');
var p2 = newPerson('lisi',15,'女');
console.log(p1);
console.log(p2);
​
p1.sayName();
p2.sayName();
​
function newDog(name,age,gender){
    var d = new Object();
    d.name = name;
    d.age = age;
    d.gender = gender;
    d.sayName = function(){
        console.log("汪汪名字是" +this.name);
    }
    return d;
}
var d1 = newDog("旺财",1,"男");
console.log(d1);
d1.sayName();//汪汪的名字是旺财
​
console.log(typeof p1);//obj
console.log(typeof d1);//obj

工厂模式创建对象的缺点:创建出来的所有对象类型都是object,没有办法去识别对象到底是Person还是Dog。

11.5 构造函数模式

function newPerson(name,age,gender){
    this.name = name;
    this.age = age;
    this.gender = gender;
    this.sayName = function(){
        console.log(this.name);
    }
}
var p1 = new Person('terry',23,'男');
p1.sayName();
console.log(p1);
console.log(typeof p1);

构造函数问题:

  1. 可以区分每个类

  2. 每个方法都要在每个实例重新创建一遍,没有必要

  3. 虽然可以将方法提取出来,提到全局范围内,然后将引用传递给对象中的函数属性,但是全局函数太多的话,体现不了类的封装性。

11.6 原型模式

function Person(){

};

原型模式特点

  1. 对于共享属性 共享函数使用这种方式创建是非常合适的

  2. 对于引用类型的数据不太好

function Person(){};
Person.prototype.name = "zhangsan";
Person.prototype.age = 12;
Person.prototype.gender = "男";
Person.prototype.sanyName = function(){
    console.log(this.name);
}
var p1 = new Person();
p1.name = "lisi";
p1.likes.push('打🏀');
var p2 = new Person();
p2.name = "wangwu";
p1.sayName();
console.log(p1.likes);
p1.sayName();
console.log(p2.likes);
 

11.7 构造函数模式 + 原型模式(组合模式)

function Person(name,age,gender){
    this.name = name,
    this.age = age,
    this.gender = gender,
    this.likes =[],
}
    Person.prototype = {
        constructor:Person,
        sayName:function(){
        console.log(this.name);
        }
    }
    var p1 = new Person('larry',12,'男');
    p1.likes.push('打🏀');
    var p2 = new Person('terry',23,'男');
    p2.likes.push('踢⚽');
​
    console.log(p1);
    console.log(p2);

11.8 继承

  1. 原型链继承

    每个构造函数都有一个原型对象,原型对象中都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。当原型对象等于另外一个类型的实例即继承。调用某个方法或者属性的步骤: a.搜索实例 b.搜索原型 c.搜索父类原型

    //定义父类类型
    function Animal (){
        this.name = "animal";
    }
    Animal.prototype.sayName = function () {
        console.log(this.name);
    }
    //定义子类
    function Dog(){
        this.color = "black";
    }
     //通过将子对象的原型对象指向父对象的一个实例来完成继承
    Dog.prototype = new Animal();
    //子对象的方法其实是定义在了符类对象的实例上。
    Dog.prototype.sayColor = function (){
        console.log(this.color);
    }
    var dog = new Dog();
    console.log(dog);
    dog.sayName();
    dog.sayColor();

    谨慎定义方法 子类型覆盖超类型中的某个方法,或者是需要添加超类中不存在的方法,都需要将给原型添加方法的代码放在继承之后(即替换原型的语句之后)

    1. 原型链继承 2

    原型链问题 ​ (1)通过原型来实现继承时,原型实际上会变成另一个类型的实例,原来的实例属性也就变成了现在的原型属性 ​ (2)在创建子类型的实例时,不能向超类型的构造函数传递参数。 ​ 因此实践中很少会单独使用原型链

    function Animal (name,age){
        this.name;
        this.age;
        
    }
    Animal.prototype.sayName = function(){
        console.log(this.name);
    }
    Animal.prototype = {
      constructor: Animal,
      sayHello: function () {
        console.log(this.name + "say hello!");
      }
    }
    function Dog (name, age, color) {
      this.name = name;
      this.age = age;
      this.color = color;
    }
    // console.log(Dog.prototype);
    ​
    // 原型链继承
    Dog.prototype = new Animal();
    // console.log(Dog.prototype);
    ​
    Dog.prototype.constructor = Dog;
    ​
    Dog.prototype.sayColor = function () {
      console.log(this.color);
    }
    var dog = new Dog("金毛", 1, "yellow");
    console.log(dog);
    dog.sayHello();               // Animal.prototype
    dog.sayColor();               // Dog.prototype
    console.log(dog.toString());  // Object.prototype
    console.log(typeof dog);
    console.log(dog instanceof Dog); //true
    console.log(dog instanceof Animal); //true
    console.log(dog instanceof Object); //true
    console.log(dog instanceof Date); //false
    // 是否是该原型派生出来的对象
    console.log(Object.prototype.isPrototypeOf(dog));// true
    console.log(Animal.prototype.isPrototypeOf(dog));// true
    console.log(Date.prototype.isPrototypeOf(dog));// false
    1. 经典继承

      经典继承(也叫借用构造函数、也叫伪造对象)(不仅可以继承方法,也可以继承属性) ​ 也称 "伪造对象" 或 "经典继承",在子类型构造函数的内部调用超类型构造函数。函数不过是在特定环境中执行代码的对象,因此通过apply(),call()方法可以在(将来)新建对象上执行构造函数,即在子类型对象上执行父类型函数中定义的所有对象初始化的代码。结果每个子类实例中都具有了父类型中的属性以及方法

      function Animal (name) {
        this.name = name;
        this.colors = ['red', 'pink']
        this.sayColor = function () {
          console.log(this.colors);
        };
      }
      function Dog (name) {
        // 继承animal
        Animal.call(this, name);
        this.color = "hotpink";
      }
      Animal.prototype.sayName = function () {
        console.log(this.name);
      }
      ​
      var dog = new Dog('铃铛');
      console.log(dog);
      dog.sayColor();
      // dog.sayName(); // 报错
      function Animal (name, age) {
        this.name = name;
        this.age = age;
        this.sayName = function () {
          console.log(this.name);
        }
      }
      Animal.prototype.sayAge = function () {
        console.log(this.age);
      }
      ​
      function Dog (name, age, color, type) {
        // this.name = name;
        // this.age = age;
        // 借用构造函数
        // 找到父类
        Animal.call(this, name, age);
        this.color = color;
        this.type = type;
      }
      ​
      var dog = new Dog('铃铛', 1, 'yellow', '金毛');
      console.log(dog);
      dog.sayName();
      // dog.sayAge(); //报错 因为是父类原型中的方法

    2. 组合继承

      function Animal (name, age) {
        this.name = name;
        this.age = age;
        this.sayAge = function () {
          console.log(this.age);
        }
      }
      Animal.prototype = {
        constructor: Animal,
        sayName: function () {
          console.log("hello,my name is" + this.name);
        }
      }
      function Dog (name, age, type) {
        // 经典继承
        Animal.call(this, name, age);
        this.type = type;
      }
      // 原型链继承
      Dog.prototype = new Animal();
      Dog.prototype.constructor = Dog;
      Dog.prototype.sayType = function () {
        console.log(this.type);
      }
      var dog = new Dog("🌸", 1, "哈士奇");
      ​
      console.log(dog);
      dog.sayName();
      dog.sayType();
      dog.sayAge();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值