对象
对象的创建方法
1:对象字面量 属性和属性名之间用 :号
var obj = {
... // 属性 : 属性值
}
2:构造函数
分为两种
(1)、系统自带
var obj = new Object();
var obj = new Array();
var obj = new Number();
var obj = new String();
var obj = new Boolean();
var obj = new Date();
(2)、自定义 属性和属性名之间用 = 号
function Func(){
... // 属性 = 属性值
}
人为规定(不强制)构造函数名大写,即用小写,使用 new 也能当构造函数使用
//大驼峰式命名规则: TheFirstPerson
//小驼峰式命名规则: theFirstPerson
(3)、用对象创建函数
var obj = Object.create(原型);
注意,括号里必须是个对象,否则报错
错误信息显示:一个对象的原型只能是一个对象 或者 null
null 创建出的对象是没有原型的,null 是没有原型的
举例:
var obj = {
...
}
var obj1= Object.create(obj)
//obj1的原型就是obj
使用构造函数构造对象时,必须使用 new ,如
function Person(){
... // 属性 = 属性值
}
var person = new Person();
//不用 new 的话就等于正常将函数的执行结果赋值给person
并且,使用了new ,只能返回对象,举个例子
<script>
var Mobile = function(name,price){
this.brand='华为';
this.name=name;
this.price=price;
this.getInfo=function(){
return this.brand+": "+this.price;
};
return {};//显式地返回一个空对象
}
var phone = new Mobile('p10',1000);
</script>
此时返回的是显式返回的对象,也就是上面的空对象
但是如果换成原始值,如下:
<script>
var Mobile = function(name,price){
this.brand='华为';
this.name=name;
this.price=price;
this.getInfo=function(){
return this.brand+": "+this.price;
};
return 123; //换成原始值
//return {};//显式地返回一个空对象
}
var phone = new Mobile('p10',1000);
</script>
返回的还是 this ,所以,如果显式返回的是原始值,会被忽略,仍然返回隐式的 this
构造函数内部原理
- 在函数体最前面隐式的加上 this = {}
- 执行 this.xxx = xxx
- 隐式的返回 this
一个例子掌握属性的增、删、改、查
<script>
var Mobile = function(name,price){
//1、声明了一个this对象,声明是自动的
// var this={};注意,这是不被执行的,只是为了演示
//2、给这个新生成的this对象添加自定义的成员(属性/方法)
this.brand='华为';
this.name=name;
this.price=price;
this.getInfo=function(){
return this.brand+": "+this.price;
};
// 3、返回这个新生成的对象 this 也是默认的
}
var phone = new Mobile('p10',1000);
var phone1 = new Mobile('p20',3000);
</script>
增、查、改都一样,采用属性访问符号 . 而删除,用 delete 对象实例.属性名 即可删除该对象实例的该属性例子:
原始值和对象
数字、字符串、布尔值
数字分两种(字符串、布尔类型也完全一致):数字原始值 和 数字对象,两者是不一样的,对象有属性和对应的属性值,也能有对象有的属性增删改查方法,像对象一样正常操作,而原始值是没有属性的,所以,通过下面两种方法产生的数字是不一样的。
var a = 10;
var num = new Number(5)
数字对象可以正常进行运算,在进行运算之后,就变成了原始值,注意是进行运算之后,num2回车,只是单纯的打印出num2的值,此时num类型还是对象,而num*=2,则是将num赋值为20,此时num 就变成了原始值,跟 num=20没区别,变成原始值,所以不能增加属性了,所以最后打印num还是输出一个原始值。
小知识点
null和undefined是没有属性的,也不能进行属性增删改查等操作
包装类
var num = 4;
num.len = 3;
原始值是没有属性的,为什么没报错,说明是可以访问的,为什么?
//包装类
var num = 4;
num.len = 3;
// var num = new Number(4).len = 3 会新建一个数字对象,并将其 len属性值赋值3 然后会销毁,注意是销毁了
此时在控制台访问 num.len 就相当于下面语句
console.log(num.len)
但是num是原始值,是没有属性的,所以不能访问,所以又会进行包装类,新建对象进行访问
// new Number(4).len
注意,之前那个包装类的新建对象已经销毁了,此时又是一个新的包装类新建对象,
只是单纯的访问,访问一个没有的属性,所以返回 undefined
数组的截断,对数组长度属性重新赋值,可截断数组
这种截断方法,是对数组本身进行操作,不是返回一个新的数组
从数组 到 字符串
var str = "hello";
str.length = 2;
//原始字符串没有属性,想访问length,系统进行包装类
//new String('hello').length
console.log(str.length);
//控制台输出结果为5,为什么不是undefined?
//因为字符串对象本身就有 length属性,而上面那个例子的 num.len 输出 undefined
是因为字符串对象本身就有 length属性,而数字对象本身没有 len属性
迷惑人的一道题
<script>
var str = 'abc';
str += 1;
var test = typeof(str);
if(test.length == 6){
test.sign = "to be wonderful";
}
console.log(test.sign);
//输出结果为 undefined
</script>
条件语句内部完全没必要看,抓住核心,test = “String” 是个字符串原始值,然后没有属性,想要访问属性sign,于是包装类过程新建一个字符串对象,但是字符串对象本身是没有 sign 属性的,访问一个自身没有的属性,结果肯定是 undefined啊!
so ,理解核心过程!