对象
对象的创建
-
var obj = {} plainObject 对象字面量/对象直接量
-
构造函数
1)系统自带的构造函数 new Object()
var obj = new Object()//有多少条语句就可以生成多少个相同的对象 obj.name='abc'; obj.sex="female"; obj.say=function(){}; js的对象是最灵活的,因为可以在对象创建之后再对这个对象的属性以及方法进行添加或者修改等操作,其他语言如Java定义对象之后对象就是死的
2)自定义
不传参式 1、定义一个构造函数(跟普通函数定义方式一样,但是命名规则为大驼峰命名规则 TheFirstName大驼峰 theFirstName小驼峰 function Car(){ this.name='BMW', this.height='1400', this.lang='4900', this.height=100, this.run=function (){ this.height--; } //注:都是用this.属性名 因为这个时候对象还没创造出来,无法实现对象名.属性名 Car.name='ffff';//这样写是错误的,Car这是构造函数的名而不是对象名 } 2、通过自定义的构造函数生成对象 后续还可以继续修改添加属性 var car1 = new Car(); var car2 =new Car(); //对象car1 car2拥有的属性相同但是两者互不干扰 传参式 function Student(name,age,sex){ this.name=name; this.age=age; this.sex=sex; this.grade='2017' } var student1 = new Student("张三",18,"fmales"); var student2 = new Student("李四",19,"males") 构造函数内部原理(三段论): 1、在函数体最前面隐式的加上this={} 2、执行this.xxx=xxx; 3、隐式的返回this
构造函数内部原理(三段论):
1、在函数体最前面隐式的加上this={}
2、执行this.xxx=xxx;
3、隐式的返回this由构造函数的原理模拟一个构造函数
//情况一 :模拟一个构造函数 function Student(name, height) { var that = {}; that.nane = name; that.height = height; return that; } var student = Student("zhangsan", 180); //这里不需要new是因为在利用构造函数生成一个对象时是从new这里开始隐式的使用三段论的,但是上面的that已经模拟三段论使隐式变成了显示所有不用new就可以了 //情况二 :构造函数返回值的捣乱 function Student(name, age, sex) { this.name = name; this.age = age; this.sex = sex; this.grade = '2017'; return {}; } var student1 = new Student("张三", 18, "fmales"); console.log(student1)//空对象{} 这是return {}取代了隐式的return this //情况三:构造函数返回值的捣乱 function Student(name, age, sex) { this.name = name; this.age = age; this.sex = sex; this.grade = '2017'; return 123; } var student1 = new Student("lisi", 18, "fmales"); console.log(student1);//{name:'lisi',age:18,sex:'fmales',grade:'2017'} 结论: 有new的话返回值只有是对象值,如果是其他数组、number等等都无法阻止返回隐式的this值
对象属性的增删改查
var deng = {
name: "laodeng",
age: 30,
}
//增
deng.wife = "laojiu";
console.log(deng);
//删
delete deng.age;
console.log(deng);
//改
deng.name = "MrDeng";
console.log(deng);
//查
console.log(deng.name);
包装类
//Number的情况跟string的一样
var num = 123;//这是原始number,不能添加属性//这是原始number,不能添加属性
console.log(num); //123
num.a = 234;//不能添加为什么不会报错?因为计算机查询到这个语法错误之后自动将其转化为new Number(num).a=234然后立即销毁 这里就是使用了包装类
console.log(num.a); //undefined 为什么不报错呢?跟上面一样使用了包装类
var num1 = new Number('123');//这是包装之后的number对象num1,可以自由添加属性
console.log(num1); //{123}
num1.a = 234;
console.log(num1); //{123,a:'234'}
//数组的情况
var num2 = [1, 2, 3];
console.log(num2);//[1,2,3]
num2.a = 345;
console.log(num2);//[1,2,3,a:345]数组本身是对象,可以添加属性,也可以打印属性
eg1:
var str = "abc";
str += 1;//"abc1"
var test = typeof(str);//"string"
if (test.length == 6) {//true
test.sign = "typeof返回值结果可能是String"
//test不是string对象,所有包装类new String(test).sign="typeof返回值结果可能是String" 然后立即销毁
}
console.log(test.sign);//undefined,
eg2:
var str = "abc";
str += 1;
var test = typeof(str);
if (test.length == 6) {
var test = new String(test);
test.sign = "typeof返回值结果可能是String"
}
console.log(test.sign);//typeof返回值结果可能是String