• 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(){
       
        })();
    
  • 相关阅读:
    -bash: fork: Cannot allocate memory 问题的处理
    Docker top 命令
    docker常见问题修复方法
    The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)
    What's the difference between encoding and charset?
    hexcode of é î Latin-1 Supplement
    炉石Advanced rulebook
    炉石bug反馈
    Sidecar pattern
    SQL JOIN
  • 原文地址:https://www.cnblogs.com/Abner5/p/6771106.html
Copyright © 2020-2023  润新知