js.基本包装器类型
1.基本数据类型 --变量和值保存在栈区 --没有方法和属性可以调用
var str='hello';
//string类型
str.split("");
自动装箱和自动拆箱 当有基本数据类型可以调用方法的时候,将基本数据类型包装成了引用数据类型
str.split("");
基本数据类型没有方法和属性可以调用,当可以调用的时候,就不是基本数据类型,变成了包装String类型 --js自动帮转
String.prototype中的方法--自动装箱 调用完之后变成了基本数据string类型--自动拆箱
2.基本包装类型
为了便于操作基本类型值,ECMAScript提供了3个特殊的引用类型Boolean, Number, String。每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型对象,从而可以调用一些方法操作这些数据。
3. var str='hello';
str.split("");
后台js会自动执行
1.创建一个String类型的一个实例--自动装箱
2.在实例上调用指定的方法
3.销毁这个实例 --自动拆箱 String类型变成了string类型
4.Object构造函数会像工厂方法一样,根据传入的值的类型返回相应基本包装类型的实例
var obj = new Object("briup"); //obj 类型为String包装类型
console.log(obj instanceof String); instanceof 判断引用类型属于哪个构造函数的方法。
5.使用new调用基本包装器类型构造函数,与直接调用同名的转换函数不一样
var str='100';
var str=Number(str);//转换器,将其他数据类型转换为number类型
var str =new Number();//一旦使用new创建的是引用数据类型的实例 Number实例
6.基本包装类型 --Number Boolean String --引用数据类型
1.创建包装类型Number的实例
var num=new Number(100);
console.log(num);--引用数据类型 //[Number: 100]
2.创建包装类型Boolean的实例
var bool=new Boolean(true);
console.log(bool); //[Boolean: true]
console.log(bool.toString);//没有进行自动装箱,本身就是一个包装Boolean类型实例
3.基本数据类型调用包装类型原型对象中的方法
var str='hello';
console.log(str.split('')); //str在调用的属性和方法的时候,自动装箱为String类型的实例,可以调用String.prototype的属性和方法,在调用完自动拆箱,回到基本数据类型str
7.String类型属性和方法
length 返回字符串长度
charAt(i) 返回指定位置的字符
charCodeAt() 返回指定字符的字符编码
concat 连接字符串
slice() 截取字符串(开始位置,结束位置)不包括结束位置的字符
substring() 截取字符串(开始位置,结束位置)不包括结束位置的字符
substr() 截取字符串(开始位置,截取字符个数)
trim() 删除前置以及后置中的所有空格,返回结果
toLowerCase() 转换为小写
toUpperCase() 转换为大写
indexOf() 从前往后查找指定字符所在位置
lastIndexOf() 从后往前查找字符串所在位置,可以有第二个参数,代表从字符串中哪个位置开始查找。
2.Math对象
Math.min() //求一组数中的最小值
Math.max() //求一组数中的最大值
Math.ceil() 向上舍入
Math.floor() 向下舍入
Math.round() 四舍五入
Math.random() 返回大于0小于1的一个随机数 [0,1)
2.其他方法:(了解即可,即用即查)
abs(num) 返回num绝对值
exp(num) 返回Math.E的num次幂
log(num) 返回num的自然对数
pow(num,power) 返回num的power次幂
sqrt(num) 返回num的平方根
scos(x) 返回x的反余弦值
asin(x) 返回x的反正弦值
atan(x) 返回x的反正切值
atan2(y,x) 返回y/x的反正切值
cos(x) 返回x的余弦值
sin(x) 返回x的正弦值
tan(x) 返回x的正切值
实例
var arr=['李白','澜','虞姬','典韦','阿珂','婉儿','后羿','韩信','猪八戒','猴子','嬴政','妲己'];
3.Date对象
getFullYear() 返回年份 如2020
getMonth() 返回日期中的月份数,返回值0(1月)-11(12月)
getDate() 返回是日期对象中的几号。
getHours() 返回日期中的小时
getMinutes() 返回日期中的分钟数
getSeconds() 返回一个日期的秒数
getDay() 返回日期中的星期几
getMilliseconds() 返回日期中的毫秒数
getTime() 将一个日期对象以毫秒形式返回
4.工厂模式
工厂模式 封装创建对象的函数,提高代码复用性,创建出来的对象都是Object类型,无法区分种类。注意方法的冗余问题,可以提供公共的方法解决方法冗余问题。*
var sayName=function(){
console.log(this.name)
}
function Person(name,age,gender){
return {
name:name,
age:age,
gender:gender,
sayName:sayName
}
}
var p1=Person('zhangsan',12,'男')
var p2=Person('lisi',22,'女')
p1.sayName();
p2.sayName();
console.log(p1,p2)
console.log(p1.sayName===p2.sayName)
function dog(name){
return {
name:name
}
}
var d1=dog('zhangsan');
console.log(d1)
5.构造函数模式
可以区分种类。但是方法还是冗余。
var sayName=function(){console.log(this.name);}
function Person(name,age,gender){
//创建一个obj
//this--obj
//执行函数内代码
//返回obj
this.name=name;
this.age=age;
this.gender=gender;
this.sayName=sayName
}
var p1=new Person('zhgangsan',12,'男');
console.log(p1)
6.原型模式
每个函数都有一个属性:prototype(原型属性),这个属性是一个指针,
指向一个对象,该对象用途是包含可以由特定类型的
所有实例共享的属性和方法.
可以共享属性和方法,但是私有属性得不到维护.
属性和方法都在原型中
function Person(){}
Person.prototype.name="zhangsan";
Person.prototype.age=15;
Person.prototype={
constructor:Person,
name:"zhangsan",
age:12,
friends:[],
sayName:function(){
console.log(this.name)
}
}
var p1=new Person();
var p2=new Person();
p1.friends.push('terry');
console.log(p1.friends,p2.friends)
7.组合模式
构造函数模式加原型模式,构造函数中放实例私有的属性,构造函数原型对象中放共有属性和方法.
function Person(name,age,gender){
this.name=name;
this.age=age;
this.gender=gender;
this.friends:[]
//创建一个实例 person
//this--person
//执行函数内的代码
//4.返回这个实例
}
Person.prototype={
constructor:Person,
sayName:function(){}
}
var p1=new Person('zhangsan',12,'男');
var p2=new Person('lisi',22,'女');
console.log(p1,p2);
p1.friends.push('wenguangxian');
console.log(p1,p2);
console.log(p1.sayName===p2.sayName);
8.继承
//当构造函数的原型对象等于另一个类型的实例就是继承
实例使用属性和方法
1.从实例对象本身查找属性或者方法
2.如果实例没有,从构造函数的原型对象中找
3.如果还没有,从父构造函数的原型对象中找
function Person(){}
Person.prototype={};
var p1=new Person();
p1.sayName=function(){};
p1.sayName(); //p1去调用sayName,自身有访问自身,自身没有访问构造函数原型对象,构造函数原型对象没有去找父构造函数
原型链继承
1.经典继承
function Animal(type,age,weight,length){
this.type=type;
this.age=age;
this.weight=weight;
this.length=length
}
Animal.prototype={
constructor:Animal,
sayType:function(){
console.log(this.type)
}
}
function Dog(type,age,weight,length,name,color){
// 经典继承 构造函数继承
Animal.call(this,type,age,weight,length);
this.name=name;
this.color=color;
}
处理完构造函数处理原型对象
2.//原型链继承
//子构造函数的原型指向父构造函数的实例
Dog.prototype=new Animal();
Dog.prototype.constructor=Dog;
Dog.prototype.sayColor=function(){
console.log(this.color)
}
var d1=new Dog('狗',1,'10kg','40cm','可乐','白色');
console.log(d1);
d1.sayType();
d1.sayColor();