js对象和包装类
对象
1. 对象的增删改查
用.
运算符操作对象属性
用delete
操作符删除对象的属性
2. 对象的创建方法
1,var obj = {} plainObject
对象字面量/对象直接量
2,构造函数创建方法
(1)系统自带的构造函数 Object() ,Array(), Number()…
var obj = new Object();
obj.name = ‘abc’;//添加属性
obj.sex = “male”;
利用这种方法创建出来的对象是一模一样的(长得一模一样),但就是两个不同的对象 。
(2)自定义的构造函数
fucntion Person(){
}
var person1 = new Person();
自定义的构造函数和普通的函数写法没区别,所以来区别就是自定义的构造函数的函数名用大驼峰式命名规则,就是首字母大写FirstName,而普通的函数用小驼峰命名规则firstName
3. 构造函数的原理
第一步:有了new 之后,构造函数就会执行,在它函数逻辑的最顶端隐式的生成一个this的空对象
第二步:执行this的赋值语句存进this对象中。
第三步:在逻辑的最后一位隐式的返回this
4. 构造函数的冷门知识点
如果让构造函数强制性的返回一个空对象{},那么person的对象就是空对象
function Person(name,height){
//var this = {};
this.name = name;
this.height = height;
this.say = function(){
console.log(this.say);
}
return {};
//return this;
}
var person = new Person('xiaowang',180);
var person1 = new Person('liuliu',175);
如果让构造函数强制性的返回number类型的数字123,那么对象person依旧还是一个对象,因为有new一个对象是不会返回原始值的,(规定原始值是不能有属性和方法的),系统就会强制性让它返回对象类型,只能返回对象类型。所以说即使你显式的写返回123,也不会返回123。
function Person(name,height){
//var this = {};
this.name = name;
this.height = height;
this.say = function(){
console.log(this.say);
}
return 123;
//return this;
}
var person = new Person('xiaowang',180);
var person1 = new Person('liuliu',175);
包装类
1,包装类:
new Number(),new Boolean(),newString()
var num = 123;//这是一个原始值数字,它是不能有自己的属性和方法的。
var a= new Number(123);//这是一个数字对象,它可以有自己的属性
a.say= "abc";
但是这个对象数字也可以像原始值一样运算.
2,问题导入:
//原始值是不能有自己的属性和方法的。
var num = 4;
num.len = 3;
console.log(num.len);// 但是为什么没有报错呢而是输出undefined
解释:在原始值调用属性的时候无论是赋值和查找,首先原始值不能有属性和方法,
那么系统它会隐式的new Number()新建一个数字对象,和原来的原始值num没关系,然后再这个数字对象上加一个属性len,new Number(4).len = 3,
然后系统觉得我新建的这个数字对象也没啥用 ,就选择销毁删掉。
再次访问这个num.len的时候,系统再隐式的new Number()新建一个数字对象,
但是没有添加len这个属性,因为刚才已经删除掉了。现在这个对象已经没有len这个属性了,一个对象没有要访问的那个属性就会返回undefined。
//但是string字符串也是原始值类型,为什么它会有自己的属性length呢?
var a = "abc";
console.log(a.length);//3
//第一步:new String('abc').length = 3; ----->delete
//第二步:new String('abc').length 。
// 这个length的属性本来就是String对象固有的属性。
// 即使第一次创建对象的时候有把它销毁了,
// 但是包装类String()里面自带的就有个属性是length
3,题目
第一题:
var arr = [1,2,3,4,5];
数组本身有一个属性length
给length赋值就把数组截断了。如下图
问题:基于数组的length属性,字符串也有length,问
var str = “abcd”;
str.length =2;
console.log(str);结果是啥?abcd
var str = "abcd";
str.length =2;
new String('abcd').length = 2; --->delete
new String('abcd').length = 4
console.log(str);//abcd
第二题:
var str = "abc";
str += 1;
var test = typeof(str); / /test = "string"
if(test.length == 6){
test.sign = "typeof的返回值可能为String";
//new String(test).sign = "XXX";=--->delete
}
//new String(test)没有sign属性了,刚才已经删掉了。
console.log( test.sign);//undefined