面向对象

86 阅读1分钟
<body>
    <!-- 基本数据类型 number string boolean null undefined Symbol -->
    <!-- 引用数据类型 object(Function Array RegExp) -->
    <!-- es6 提供一个基本数据类型Symbol -->
    <!-- Symbol代表了唯一的一个数 不可以new -->
    <script>
        /* console.log('1'==='1');  *//* =>true */
        /*  console.log( Symbol('1') == Symbol('1') ); */
        /*  用Symbol包裹的数据是唯一的 独一无二的 */
        /*  console.log( Symbol('1') ); */
        /* 首字母开头大写的叫 构造函数 可以new */
        //   let obj = new Object()
        //   console.log(obj);
        /* let a = new Symbol('username')  不可以new*/

        /* 两个人在同时开发一个页面 */工厂模式 构造函数 栈内存和堆内存 const关键字
        /* 小A定义了对象obj */
        //    let obj = {
        //        username:"zhangsan"
        //    }
        //    /* 小B 不知道这个obj 有的key叫username
        //    把username 重新赋值了 造成了问题*/
        //    obj.username = 'lisi'

        //    console.log(obj);

        // let obj = {
        //     [Symbol('username')]: "zhangsan"
        // }
        // console.log('old',obj);
        // obj.username = 'lisi'
        // console.log('new',obj);

        // [] 如果里面的时候一个变量 可以直接写 o[user1]
        // 这里面的user1 就是一个变量
        // o['user1'] =>{user1:'zhangsan'}
        // let user1 = 'username'; 
        // let o = {}; /* => {username:'zhangsan'} */
        // o[user1] = 'zhangsan'
        
    </script>
</body>
复制代码
<body>
    <!-- 构造函数的方式 -->
    <script>
        /* obj是Object new出来的一个实例化对象 */
        // let obj = new Object()
        // obj.name = 'taotao'
        // obj.age = 30
        // obj.kaiche = function (){
        //     document.write( `${obj.name}--年纪${obj.age} 会开车` );
        // }
        // obj.kaiche();

        let obj = {
            "name":"taotao",
            "age":30,
            "kaiche":function (){
                console.log('this',this);
                document.write( `${this.name}--年纪${this.age} 会开车` );
            }
        }
        /* this是谁调用就是谁的  */
        obj.kaiche()
        console.log(obj);
        /* 对象字面量 */
        /* 对象定义的一种简写形式 */
        /* 简化创建包含大量属性的对象的过程 */
        /* 在为函数传递大量可选参数时,可考虑使用对象字面量 */
    </script>
</body>
复制代码

工厂模式

<body>
    <script src="gongc.js"></script>
    <script>
        /**
         * @param name String 姓名
         * @param age Number 年纪
         * @param job String 职业
         * @param address String 住址
         * @方法 intro 可以打印出人物的信息
         * */
        let person1 = getPerson('张三',30,'工人','南京市江宁区')
        // console.log(person1.name);
        // console.log(person1.age);
        // console.log(person1.job);
        // console.log(person1.address);
        person1.intro();

        let person2 = getPerson('涛涛',40,'纺织工人','南京市秦淮区')
        person2.intro();

        let person3 = getPerson('涛涛2',40,'纺织工人','南京市秦淮区')
        person3.intro();

        console.log( person3.getTime() )

        /* 软件工程领域的一种设计模式 */
        /* 抽象了创建对象的过程 */
        /* 通过函数封装创建对象的细节 */

        /* 工厂模式的缺点 */
        /* 看不出类型(比如是时间对象 会具有时间对象的属性和方法)--解决:构造函数 */
        /* 函数重复、浪费资源(消耗内存)--解决:原型 */

    </script>
</body>
/* 工厂模式 */
function getPerson(name,age,job,address){
    /* Date.now() 也是获得毫秒数  获取的速度比getTime方法要快 */
    // let person = new Date();
    let person = new Object();
    person.name = name
    person.age = age
    person.job = job
    person.address = address
    person.intro = function (){
        document.write(
            `
                <p>姓名:${this.name}</p>
                <p>年纪:${this.age}</p>
                <p>工作:${this.job}</p>
                <p>地址:${this.address}</p>
            `
        );
    }
    return person
}
复制代码

构造函数

<body>
    <!-- 系统提供的构造函数 -->
    <!-- String Number Boolean Object RegExp Date Array -->
    <!-- 构造函数一般以大写字母开头 -->
    <!-- 构造函数也是函数,只不过可以用来创建对象 -->
    <!-- 与工厂模式对比
            没有显式创建对象
            直接将属性和方法赋给了this对象
            没有return
    -->
    <script>
        function Person(){
            this.name = '张三'
            this.fn = function (){
                document.write(this.name)
            }
        }
        /* new 先创造了一个是实例化对象 并且把this给了实例化对象per1 */
        /* 也就是把属性和方法给了per1 */
        let per1 = new Person();
        console.log(per1);
    </script>
</body>
复制代码

栈内存和堆内存

<script>
        /* 引用数据类型 会开辟一个内存(栈内存(内存的地址) 和 堆内存(内存的值) ) */
        let obj1 = {name:'zhangsan',age:20};
        let obj2 = {};

        /* obj1的栈内存的地址给了obj2 */
        obj2 = obj1;

        /* obj2 把obj1的堆内存的name值 由zhangsan 改成了 lili */
        obj2.name="lili"

        /* 所以 obj1 和 obj2 的值 都是一样的 其实都是obj1的堆内存的值 */
        console.log('obj1',obj1);
        console.log('obj2',obj2);
    </script>
复制代码

const关键字

<script>
        /* var let */
        /* 
            let不能重复声明
            let具有块级作用域(暂时性的死区) 
            let不能变量提升 
        */
        /* 定义常量的 不能给常量重复的赋值 */
        // const url = 'http://timemeetyou.com:8889/api/private/v1/';
        /* url = 'http://www.baidu.com' */ /* 会报错 */

        /* 定义对象 引用数据类型 会开辟一个堆内存 内存地址不会变化*/
        /* 地址不会被改变 也就不会报错 */
        const obj = {
            name:"zhangsan"
        }
        obj.name = 'lili'
        obj.age = 20

        /* 改变obj的内存地址会报错 */
        /* let obj2 = {}
        obj = obj2; */
        
        console.log(obj);
        
    </script>