JS笔记(六)对象

要理解:
    面向过程
    面向对象
    对象
        创建对象的不同方式
        自定义对象
    数据类型深入
    简单的类型和复杂的类型
        内置对象
    
 
1、面向对象:可以创建自定义的类型
    面向对象特性:封装、继承(类)、多态(抽象性),比如JAVA
    JS不是面向对象语言,但可模拟面向对象的思想
    JS是一门基于对象的语言,里面有对象
 
 
2、对象:
对象:就是看得见,摸得到的某个东西
找对象:班主任不是对象,因为这是一类。我们班的班主任是对象。
 
对象概念:Js中就是一组无序的属性的集合
对象的特点:有特征(属性)和行为(方法)
 
总结对象:有特征和行为,具体指的某一事物,“一组无序属性的集合的键值对“
                (有属性和方法,具体特指某个事物)
        属性是键值对:属性名:值;//对象的属性值可以是任何类型的数据,也可以是函数
        如person.sex='女';
 
 
3、创建对象:
三种方式:
(1)调用系统的构造函数创建对象
    var  变量名 = new object();
 
    //实例化对象:
    var  obj = new Object();
    //添加属性:
    obj.name = "小苏"
    obj.age = 18;
    //添加方法:
    obj.eat = function(){
        console.log("我喜欢吃蛋糕");
    };
    obj.play= function(){
        console.log("我喜欢玩游戏");
    };
    //调用:
    console.log(obj.name);
 
 
一次性创建多个对象?把创建对象的代码封装在一个函数中
    function createObject(name,age){
        var  obj = new Object();
        obj.name = name;
        obj.age = age;
        obj.sayHi= function(){
            console.log("我叫:" + this.name  + "我今年" + this.age + "岁");
        };
        return obj;
    }
    var  per1 = createObject("小苏","20");
    per1.sayHi();
 
 
(2)自定义构造函数创建对象(结合第一种和需求通过工厂模式创建对象)
    (原本是系统的new Object();)
 
    函数和构造函数的区别:
            1)首字母是大写的,是构造函数,为了创建对象。普通函数首字母小写,驼峰命名;
            2)调用方式不同,普通函数xx();即可,构造函数var xx = new xx();
            3)构造函数名和类名相同,也都是xx;
 
            4)构造函数内部用this来构造属性和方法:this.name=name; this.sayHi=function(){}
 
            自定义构造函数过程:
            function Person(name,age){
                this.name=name;
                this.age=age;
 
                this.sayHi=function(){
                    console.log("我叫:" + this.name + "年龄是" + this.age);
                }
            }
            var obj = new Person("小明",20);
            console.log(obj.name);
            obj.sayHi();
 
 
------在java中
------new一个对象:PersonDemo PD = new PersonDemo();   //PersonDemo()在代码中可找到对应PersonDemo类
------PersonDemo PD就是在内存中分配一个变量,名字是PD,这个变量是PersonDemo类型
------new PersonDemo(); 是new这个关键字和PersonDemo()这个构造方法来创建一个对象,new这个PersonDemo类的一个对象。程序运行,会调用构造方法PersonDemo(),执行完毕,PersonDemo类型的对象PD就构造出来了,出现在内存当中。会把这个内存地址返回,赋值给PD,PD就是引用变量,或者叫变量,PD的值就是一个地址,在内存中东西就是对象/实例。
 
 
        5)当创建对象时,var obj = new Person("小明",20); 发生了四件事
            一、在内存中开辟(申请一块空闲的空间)空间,存储创建的新的对象;
            二、把this设置为当前对象;
            三、设置对象的属性和方法;
            四、把this这个对象返回;
 
        6)普通函数和构造函数的返回值:
            function  person(){   }
            var per = new persopn();
            console.log(per); //没有返回值,返回undefined
 
            function Person(){   }
            var per = new Person();
            console.log(per); //返回[object,object],构造函数会马上创建一个新对象,并将他作为返回值返回
 
        7)对象创建的内存图:
    
 
        8)用instanceof检查一个对象是否是一个类的实例,是则返回true;
            coonsole.log(per instanceof Person);
            如:console.log(Array  instanceof  Object); //Array 系统的对象,返回true
 
 
(3)字面量的方式创建对象
    var obj = {}; // 这是一个空对象
    obj.name = "小苏";
    obj.age = 20;
    obj.sayHi= function() {
        console.log("我是" + obj.name);
    }
     obj.sayHi();
 
优化:
     var obj = {
        name: "小苏",
        age: 20,
        sayHi: function() {
            console.log("我是" + obj.name);
        }
    };
    obj.sayHi();
 
缺陷:一次性的对象,后面可以在函数外更改obj.name = "小小苏"
 
--->点语法:对象.名字=值;对象.名字=函数;
 
 
 
4、访问属性的另一种方法:
            function Person(name,age){
                this.name=name;
                this.age=age;
                this.sayHi=function(){
                    console.log("我叫:" + this.name + "年龄是" + this.age);
                }
            }
            var obj = new Person("小明",20);
            console.log(obj.name);
            obj.sayHi();
 
另一种:obj["name"] = "佐助";   console.log(obj["name"]);
            或者:obj.["sayHi"]();
 
 
 
 
5、Json格式数据及遍历:
    (一般都是成对的,是键值对:name:"小苏")
    json是个对象,数据都是成对的,一般json格式的数据无论键还是值都是用双引号括起来的
 
    对象设置属性的值的写法:
    对象.属性名字 = 值;-----点语法
    对象["属性的名字"] = 值;
 
遍历:不能通过for循环,因为是无序结构的
          用for-in循环
          var  json = {"name":"小苏", "age":"10"};
          for(var  key  in json){  //key是一个变量,这个变量中存储的是该对象所有属性的名字
                console.log( key );  //json对象中的属性的名字
                console.log( json[key] );  //每个的值
          }
 
 
 
 
6、简单类型和复杂类型:
        原始数据类型:number,string,boolean,undefined,null,object
        基本数据类型(值类型):String、Number、Boolean、Null、Undefined
        引用数据类型(引用类型):Object对象
        空类型:undefined,null
 
        (1)值类型的值在哪一块空间中存储?
                存储在栈内存中,值与值之间单独存在
        (2)引用类型的值哪一块空间中存储?
                地址在栈内存存储,对象在堆内存存储,每创建一个对象,会在堆内存中开辟新空间,变量保存的是对象的内存地址(即对象的引用),对象的值是保存在堆内存中的,而对象的引用(即变量)是保存在栈内存中。
 
 
 
 
 
 
7、值类型和引用类型传递:
(1)值类型传递的是值:
例1:
        var num = 10;
        var num2 = num; //把num的值传递给num2,num的栈中一样放着10
 
例2:
    function  f1(x){
        x = 100;
    }
    var  num = 10;
    f1(num);
    console.log(num); //10
 
例3:
    var  num1 = 10;
    var  num2 = num1;
    num1 = 20;
    console.log(num1); //20
    console.log(num2); //10
 
 
 
(2)引用类型传递的是地址(引用):
例4:
        var obj ={
            name:"小明"
        }
        function f2(obj2){
            obj2.name="小红";
            console.log(obj.name); //小红
        }
        console.log(obj.name); //小明
        f2(obj);
        console.log(obj.name); //小红
注:如果希望两个变量之间不受影响,可以用Object.assign()来复制对象。
  var obj3 = Object.assign({}, obj1);
 
 
例5:
    var num = 50;
    function f1(num){
        num = 60;
        console.log(num); //60
    }
    f1(num);
    console.log(num); //50
 
 
 
例6:
    var  num1  = 55;
    var  num2  = 66;
    function  f1(num,num1){
        num = 100;   //外边的num1
        num1 = 100;  //外边的num2
 
        num2 = 100;  //隐式全局变量
 
        console.log(num); //100
        console.log(num1); //100
        console.log(num2); //100
    }
    //num2 = 100; 函数运行完num2出现
 
    f1(num1,num2);
    console.log(num1 + "num1"); //55
    console.log(num2 + "num2"); //100 , 隐式全局变量
    console.log(num + "num"); //undefined,局部变量
 
 
 
例7:
    function  Person(name,age,salary){
        this.name = name;
        this.age = age;
        this.salary = salary;
    }
    function f1(person){
        person.name = "ls";
    }
    var  p = new Person("zs",188,1000);  //创建p对象
    console.log(p.name); //zs
    f1(p);
    console.log(p.name); //ls
 
    function  Person(name,age,salary){
        this.name = name;
        this.age = age;
        this.salary = salary;
    }
    function f1(person){
        person.name = "ls";
        person = new Person("aa",18,10);   //重新开堆
    }
    var  p = new Person("zs",188,1000);
    console.log(p.name); //zs
    f1(p);
    console.log(p.name); //ls
 
 
 
 
 
posted @ 2020-08-06 11:32  kalends  阅读(74)  评论(0编辑  收藏  举报