zoukankan      html  css  js  c++  java
  • js 多种方式创建对象

    引用类型-值类型

    数值型

        var num1; //这个时候不进行内存分配
        var num3=9;//分配内存
        var num4=num3;//会不会分配————分配内存 彼此拥有独立的内存空间,互不影响
    

    字符串型

        var str1; //这个时候不进行内存分配
        var str2 = '传智播客'; //分配内存
        var str3=str2; //问题,这里str3 会不会分配内存??————会
        console.log(str2===str3) //比较的是指针指向的内存空间中存储的值
    

    数组

        // 内存会产生两篇区域,一个存储变量,一个存储数组 变量中保存的只是数组所在的地址
        var arr1=['传智播客','黑马'];//分配内存
        //引用类型其实是指向同一个地址,也就是操纵的其实是同一个位置
        var arr2=arr1;   //问题:这里arr2会不会分配内存
        console.log(arr1[0]);  //传智播客
        console.log(arr2[0]); //传智播客
    
        //修改数组1
        arr2[0]='水浒传 西游记 三国演义 红楼梦';
        console.log(arr1[0]);//水浒传 西游记 三国演义 红楼梦
        console.log(arr2[0]);//水浒传 西游记 三国演义 红楼梦
    

     函数 - 本质是对象类型

    //系统都会在内存中生成两个区域:一个存储变量,一个用来存储函数
    //而变量中存放的只是函数空间所在的地址(指针)
    //由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定。
    //由于函数名仅仅是指向函数的指针,
    //因此函数名与包含对象指针的其他变量没有什么不同。
    //换句话说,一个函数可能会有多个名字,例如:

    function sum(num1,num2)
        {
            return num1 + num2;
        }
    console.log(sum(10,10)); //20
    

    //内存是如何分配的? 这里不会在内存生成新的空间,存储函数,而是生成一个变量,变量中保存的是同一个地址

    var anotherSum = sum;
    sum = null;//这里只是将sum变量中原来保存的是函数地址,然后赋值成null,这样做并不会影响到函数对象对应的内存空间
    console.log(anotherSum(10,10)); //20
    console.log(sum(10,10)); //20

    // 其中上面的四种(undefined, number, string, boolean)属于值类型,不是对象。
    // 函数、数组、对象、null、new Number(10)都是对象。他们都是引用类型。

    堆 和 栈

    数据都是放在内存中的的

    内存分成两种:栈 堆

    栈:值类型保存在栈里面  -- 类似一个数组  --

    如何获取:下标值 -- 和数组的获取方式类似

    堆:引用类型


    object,工厂,构造,原型,混合方式(构造+原型)

    创建对象之工厂模式 

    工厂方式 : 封装函数 ——作为工厂的原料,输入进去,经过工厂之后生成一个对象

      //这里name是我们输入的原料
      function createPerson(){
        //1.原料
        var obj = new Object();
        //2.加工
         obj.name = '剑侠客';
         obj.technologys=['普通攻击','横扫千军','地狱火','漫天飞雪'];
         obj.attack = function(){
         alert(obj.name+'发出攻击,导致对方10点伤害值')
        };
         //3.出场
          return obj;
      }
     var boy = createPerson();
     boy.attack();
    

    思考场景:一个是写这个工厂的,一个是使用工厂的

    原型

    1,原型创建存在问题:

     原型方式主张将一切都放在原型中
     存在的缺点:name是每个实例不一样的

        var Role =function() {}
        /*姓名*/
        Role.prototype.name={nickName:'客',accountName:'876791562@qq.com'};
        //跑起来
        Role.prototype.run=function() {
            alert('run');
        }
    
        /*引用类型有问题*/
        var boy = new Role()
        boy.name.nickName='剑侠客'
        console.log(boy.name.nickName)   //剑侠客
        var girl = new Role()
        girl.name.nickName = '可爱宝贝'
        console.log(boy.name.nickName) //可爱宝贝
        console.log(girl.name.nickName) //可爱宝贝
    

      

    2,解决办法:

    引用类型有问题 -- 通过混合方式解决

        /*引用类型有问题*/
        var boy = new Role()
        boy.name.nickName='剑侠客'
        console.log(boy.name.nickName)   //剑侠客
        var girl = new Role()
        girl.name.nickName = '可爱宝贝'
        console.log(boy.name.nickName) //剑侠客
        console.log(girl.name.nickName) //可爱宝贝
    

    字面量形式

    var boy = {
    	name: '剑侠客',
    	image: '男性头像',
    	technologys: ['普通攻击', '横扫千军', '地狱火', '漫天飞雪']
    };
    

    //将对象转换成字符串

    console.log(JSON.stringify(boy));
    

    //将字符换转换成json对象

    var sboy = '{"name":"剑侠客","sex":"男","HP":100}';
    var objBoy = JSON.parse(sboy);

    拷贝模式

    拷贝创建对象

        var boy = {
            name:'郭靖'
            ,image:'男性头像'
            ,age:20
            ,sex:'男'
        };
        var girl = {
            name:'黄蓉'
            ,age:18
            ,image:'女性头像'
            ,sex:'女'
        };
    

    六大神器之一

    使用

        var zuixiake = $$.extend({}, boy);
        var huangrong = $$.extend({},girl)
        alert(zuixiake.name);//郭靖
        alert(zuixiake.sex);//男
        console.log(huangrong.name)//黄蓉
    

    封装函数的用处:就是将一个json对象 所有属性拷贝给另外一个对象

        /*source:原始对象*/ /*target:目标对象*/
        function extend(target,source) {
            //遍历对象
            for(var i in source){
                target[i] = source[i];
            }
            return target;
        }
    

    闭包类

    立即执行

        (function(){
       
        })();
    
  • 相关阅读:
    201771010112-罗松 实验四 软件项目案例分析
    201771010112-罗松 实验三 结对项目—《西北师范大学疫情防控信息系统》项目报告
    201771010112-罗松 实验一 软件工程准备-<初步了解软件工程>
    201771010112罗松《面向对象程序设计(java)》第十八周学习总结
    201771010112罗松《面向对象程序设计(java)》第十七周学习总结
    201771010112罗松《面向对象程序设计(java)》第十六周学习总结
    201771010112罗松《面向对象程序设计(java)》第十五周学习总结
    罗松-东文财-赵栋201771010112罗松《面向对象程序设计(java)》第十四周学习总结
    201771010112罗松《面向对象程序设计(java)》第十三周学习总结
    201771010112罗松《面向对象程序设计(java)》第十二周学习总结
  • 原文地址:https://www.cnblogs.com/Abner5/p/6771106.html
Copyright © 2011-2022 走看看