对象写法
属性名后面跟属性值,组成键值对,属性名后面也可以跟函数,也叫做方法
var mrDeng = {
name : "MrDeng",
age : 40,
sex : "male",
health : 100,
smoke : function () {
console.log('i am smoking!cool!');
mrDeng.health --;
},
drink : function () {
console.log('i drinking!');
mrDeng.health ++;
}
}
mrDeng.smoke();
//调用mrDeng的smoke方法然后执行health--
//控制台调用mrDeng.health会出现结果 99
//方法里面的mrDeng可以替换为this,因为是第一人称
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
属性的增删改查
增:mrDeng.wife = "xiaoliu"
想增加哪个属性直接写对象名.属性名=“属性值”
删:delete mrDeng.name
想删哪个delete空格对象名.属性
改:mrDeng.sex = "female"
想改哪个直接写对象名.属性=“属性值”
查:mrDeng.wife
# 对象的创建方法
# 1.var obj ={}
plainObject 对象字面量/对象直接量
# 2.1 构造函数创建方法
系统自带的构造函数 Object()
var obj = new Object();
new Object()
new
加上一个构造方法的执行,就能返回一个真正的对象,把对象用变量obj接收。
var obj = new Object(); 构造函数对象,执行一次生产一个对象 并且每次执行生成的都是一模一样且相互独立的 var obj = {}
# 2.2 自定义构造函数
函数就是构造函数的一种,函数结构和函数没有任何的区别
function Person() {
}
var person1 = new person();
//想自定义一个构造函数必须得用new操作符,才能构造出一个对象来。
//person1现在就是一个对象,可以进行增删改查等操作。
//person1.name="deng";
//输入person1 就会输出一个对象person1 里面有属性name 属性值deng。
2
3
4
5
6
7
# 构造函数命名规则
大驼峰式命名规则 TheFirstName
# 构造函数例子
function Car() {
this.name = "BMW";
this.height = "1400";
this.lang = "4900";
this.weight = 1000;
}
var car = new Car();
var car1 = new Car();
car.name="Maserati";
car1.name="Merz";
//在控制台输出car 会显示一个对象car 里面有属性名name属性值Maserati
//输出car1里面有属性名 name 属性值 Merz
2
3
4
5
6
7
8
9
10
11
12
提示
每个构造函数都是彼此独立的,他们的属性和属性名可能一样,但都是彼此独立的。
# 例子 可以进行传入参数来改变构造函数内部自己想要的属性值
function Car(color) {
this.color = color;
this.name = "BMW";
this.height = "1400";
this.lang = "4900";
this.weight = 1000;
}
var car = new Car('red');
//red传到 color car.color='red'
var car1 = new Car('green');
//green 传到 color car1.color='green'
2
3
4
5
6
7
8
9
10
11
# 例子2:公有属性继承
function Student(name,age,sex) {
this.name = name;
this.age = age;
this.sex = sex;
this.grade = 2017;
}
var student = new Student('xiaowang','18','male');
//输出student会输出student对象
//里面包含了namexiaowang age18 sexmale grade2017
//因为2017是公有的
2
3
4
5
6
7
8
9
10
# 构造函数执行顺序
function Student(name,age,sex) {
//构造函数的前提是必须得给函数前面加new
//第一步 var this = {};
//第二步 AO{this:{}}
this.name = name;
this.age = age;
this.sex = sex;
this.grade = 2017;
//第三步return this;
}
var student = new Student('xiaowang','18','male');
2
3
4
5
6
7
8
9
10
11
# 构造函数内部原理
构造函数内部原理
1.在函数体最前面隐式的加上this={}
2.执行this.xxx=xxx;
3.隐式的返回this
# 模拟一个构造函数内部例子:
function Person(name,height) {
var that = {}; //第一步
that.name = name;
that.height = height; //第二步
return that; //第三步
}
var person = new Person('xiaowang',180);
var person1 = new Person('xiaozhang',175);
2
3
4
5
6
7
8
但凡用new,返回的必须是对象值 数组 function,但就是不能返回原始值。
# 包装类
var num = 123;
原始值:原始值是不能有属性和方法的,属性和方法只有对象能有,这是对象独特的东西。
对象
对象包括自己 Object
包括数组 Array
包括函数 function
只有原始值数字才算原始值,原始值字符串才算原始值。
var num = new Number(123);
这种也叫数字
var str = new String('a');
这种也叫字符串
var bol = new Boolean();
此时num 返回的是对象123
对象可以加属性num.abc ='a'; 访问num.abc 输出a。
对象类型的数字可以进行运算,但返回的值成为了number。
undefined和null不可以有属性
var num = 4;
num.len = 3;
console.log(num.len); //undefined
2
3
# 执行过程
1.系统会隐式的创建 new Number(4).len = 3;
把num 的值 4 放到 newNumber 里面去,调用 len 方法。最后delete掉,因此没有报错。
原始值不能有属性和方法,一个对象没有属性必然返回undefined 如果再次进行访问的话还是隐式执行 new Number(4).len
# 包装类例子
var str = "abcd";
str.length = 2;
console.log(str); //abcd
2
3
# 执行过程
1.因为原始值string没有length方法 所以会隐式创建new string(“abcd”) 然后delete
2.进行访问会隐式创建new string(“abcd”).length
而字符串对象
本身就有length属性,console.log(str.length)
输出4
# 包装类例子
var str = "abc";
str += 1;
var test = typeof(str); //test == "string"
if(test.length == 6) {
test.sign = "typeof 的返回结果可能是 string"
//new String(test).sign = 'xxx'
}
//new String(test).sign delete
consle.log(test.sign); //undefiend
2
3
4
5
6
7
8
9
# arguments
function test(x,y,a) {
arguments[2] = 10;
console.log(a); //10
}
test(1,2,3);
2
3
4
5
实参列表和形参列表相对应 arguments是实参列表 实参动形参也动两者是相互映射的关系。