对象的创建方法
1.通过对象字面量直接创建
var obj = {} plainObject // 对象字面量|对象直接量
2…通过构造函数来创建对象
(1)用系统自带的构造函数 Object()
var obj = new Object();
(2)自定义构造函数来创建对象
为了和函数相区分,一般将对象名的单词首字母大写
function Person() {};
var person1 = new Person();
构造函数内部原理
(1)在函数体最前面隐式的加上this = {}
(2)执行构造函数体内的语句
(3)隐式的返回this
//举例
function Student(name, age, sex){//定义一个构造函数
this.name = name;
this.age = age;
this.sex = sex;
this.grade = 2020;
}
var student = new Student('xiaoMing', 18, 'male');//新建一个student对象
那么为什么通过new可以新建一个Student对象,当用new时,会在构造函数体内的前面和后面隐式的加上一些语句,使得新对象创建成功.
//接上部分代码,当用new Student()后,function Student(){}变为
function Student(name, age, sex){
//var this = {};隐式定义一个空对象
this.name = name;
this.age = age;
this.sex = sex;
this.grade = 2020;//执行语句
//return this;返回this这个对象
}
那么如果我想显式的return一个值
function Student(name, age, sex){
//var this = {};隐式定义一个空对象
this.name = name;
this.age = age;
this.sex = sex;
this.grade = 2020;//执行语句
return {};
}
var st1 = new Student('xiaoming', '20', 'male');
> st1
< {} //返回一个空对象,说明我们显示的return空对象成功了
那么如果return一个原型值123
function Student(name, age, sex){
//var this = {};隐式定义一个空对象
this.name = name;
this.age = age;
this.sex = sex;
this.grade = 2020;//执行语句
return 123;
}
var st1 = new Student('xiaoming', '20', 'male');
> st1
< Student {name: "xiaoming", age: "20", sex: "male", grade: 2020}
//任然返回this对象,因为如果return一个原型值的话,程序就会自动忽略,所以任然
//隐式的返回空对象
包装类
1.Number(),String(),Boolean()
方法
原始值:number,string,boolean,undefined,null
> var num = new Number(22);//创建一个数字对象,当然string和boolean同理
> num.abc = 'aa'; //给这个数字对象添加属性
> num.abc
< 'aa'
2.包装类
原始值不能有属性和方法,那为什么字符串可以引用length
属性,且添加属性和方法不报错?
> var str = 'cici';
> str.length
< 4 //返回长度为4
> str.abc = 'aab'; //添加一个属性abc
> str.abc //查看这个属性
< undefined //打印未定义
因为当原始值引用属性和方法时,会将原始值隐式的包装成类,然后在销毁
//例如
var num = 20;
num.len = 3;
//相当于隐式的声明
//new Number(num).len = 3;
//delete;//再销毁
//那么再去访问num.len
> num.len
< undefined //因为所包装成的类已被销毁,所以为undefined