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);
构造函数问题:
-
可以区分每个类
-
每个方法都要在每个实例重新创建一遍,没有必要
-
虽然可以将方法提取出来,提到全局范围内,然后将引用传递给对象中的函数属性,但是全局函数太多的话,体现不了类的封装性。
11.6 原型模式
function Person(){
};
原型模式特点
-
对于共享属性 共享函数使用这种方式创建是非常合适的
-
对于引用类型的数据不太好
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 继承
-
原型链继承
每个构造函数都有一个原型对象,原型对象中都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。当原型对象等于另外一个类型的实例即继承。调用某个方法或者属性的步骤: 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();
谨慎定义方法 子类型覆盖超类型中的某个方法,或者是需要添加超类中不存在的方法,都需要将给原型添加方法的代码放在继承之后(即替换原型的语句之后)
-
原型链继承 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
-
经典继承
经典继承(也叫借用构造函数、也叫伪造对象)(不仅可以继承方法,也可以继承属性) 也称 "伪造对象" 或 "经典继承",在子类型构造函数的内部调用超类型构造函数。函数不过是在特定环境中执行代码的对象,因此通过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(); //报错 因为是父类原型中的方法
-
组合继承
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();
-