对象写法

属性名后面跟属性值,组成键值对,属性名后面也可以跟函数,也叫做方法

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,因为是第一人称
1
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。 
1
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
1
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'
1
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是公有的
1
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');
1
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);
1
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 
1
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
1
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
1
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);
1
2
3
4
5

实参列表和形参列表相对应 arguments是实参列表 实参动形参也动两者是相互映射的关系。