js---包装类

1.包装类----js以new的方式抽象出一类相同特征的对象的集合,就是说new会产生一个由构造函数丰满后的对象

function Person(){
    //var this={}  系统在new的时候隐式产生
    ...//函数里的代码
    //return this  系统在new的时候隐式产生
}
var person = new Person();//由于new的时候,会返回一个有构造函数构造后得到的{},所以这里的person是个对象
function Person(name,age){
    //var this={}  系统在new的时候隐式产生
    this.name=name;//this就是当前隐式产生的{}
  this.age=age;
   this.sex='male';
    //return this  系统在new的时候隐式产生  此时this经过构造函数的丰满,this--->{name:'xiaohong',age:12,sex:'male'}--->就是person
}
var person = new Person('xiaohong',12);//由于new的时候,会返回一个有构造函数构造后得到的{},所以这里的person是个对象

例子---修改构造函数返回值:

function Person(name,age){
    //var this={}  系统在new的时候隐式产生
    this.name=name;//this就是当前隐式产生的{}
    this.age=age;
    this.sex='male';
    return {name:'haha',age:1}
    //return this  系统在new的时候隐式产生  此时this经过构造函数的丰满,this--->{name:'xiaohong',age:12,sex:'male'}--->就是person
}
var person = new Person('xiaohong',12);//由于new的时候,会返回一个有构造函数构造后得到的{},所以这里的person是个对象
console.log(person)//{name:'haha',age:1}   但是注意:如果构造函数内人为的返回一个原始值,那么依然会返回系统的this,也就是说new出来的必须是个对象

例子---系统自带的构造函数:

var arr = new Array();
var string = new String();
var boolean = new Boolean();
var num=new Number();
console.log(arr,string,boolean,number);//[] {"",length:0} {false} {0} 这是简写形式,大家有兴趣可以自己打印试下,值都在[[PrimitiveValue]]存着,另外从另个方面说明数组也是对象
注意:这四种都在自己构造函数的原型重写了toString方法,用以转换为字符串形式,而不是调用Object的toString,这就是Js中函数的重写

上面先说系统自带的构造函数是为了说明系统隐式的包装类

例子---原始值是不可能有属性的,但是会存在包装类

var num = new Number(123);
console.log(num);  //{123}
num.len=5;
console.log(num.len,num*2,num);  //5 246 {len:5,[[PrimitiveValue]]:123}


//但是对于原始值来说---数字
var num = 12;
num.length = 2;
//num是原始值的数字,系统会隐式包装类---new Number(num),并且执行new Number(num).len=2 
//但是系统会发现这个new Number(num)在任何地方都没有被引用,会立马delete这个对象
console.log(num.length);
//undefined 系统又遇到num.len  又会隐式包装类---new Number(num),
//然后此时的new Number已经是一个新的了,不是刚刚赋值的那个了,这个新的自然是没有len属性的



//为什么数组和字符串都能取到length,但是数组可以截断,修改length,但是str不可以??
var arr=[1,2,3];
arr.length=2; 
//系统会隐式包装类---new Array(arr).length=2 然后销毁?---答案是不可能
//new Array返回的是啥?是数组!原始值不可能被new返回!!所以数组不是原始值
//意味着数组本身就是对象,然后系统配的就有length属性,对象的属性想改就改,改了就生效,不需要隐式包装类。
console.log(arr);//[1,2]
var str='abcd';
str.length=2; //系统会隐式包装类---new String(str).length=2,然后销毁new String()对象 
console.log(str,str.length);//'abcd' 4---new String(str).length,字符串本身系统就给配了length属性,即在new String(str)时传的str的字符个数





猜你喜欢

转载自blog.csdn.net/github_39132847/article/details/79666246
今日推荐