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(){
   
    })();
原文地址:https://www.cnblogs.com/Abner5/p/6771106.html