js---15深拷贝浅拷贝 原型链

//&&得到的结果不是布尔类型,如果前面都是 true就执行最后一个,并返回最后一个表达式的值,前面有一个为false,后面不执行,返回前面表达式的值
var a = 3;
var b = a && (a = 4);
console.log(b);//4
var b = a && (a ++);
console.log(a);//5
console.log(b);//4
a && (a ++);
console.log(a);//6

var c = 0;
var d = c && a++;
console.log(a);//6
console.log(d);//0

var c = 0;
var d = b && c && a++;
console.log(a);//6
console.log(d);//0

var c = false;
var d = b && c && a++;
console.log(a);//6
console.log(d);//false

// || 前面是true,后面不执行,返回前面表达式值。前面是false,返回后面表达式的值
var a1 = 3;
var b1 = a1 || a1++;
console.log(a1);//3
console.log(b1);//3

var a1 = 0;
var b1 = a1 || a1++;
console.log(a1);//1
console.log(b1);//0

====================================================================
//浅拷贝,指向同一个内存区域
var person ={
     name:"cj",
     age:22,
     address:{
         home:"home address",
         office:"office address"

     },
     schools:["xiaoxue","daxue"]
 };
var programer = {
     language:"javascript"
 };
//全部复制
function  extend (p,c) {
     var c = c ||{}; //如果c是undefined或者null,就是{}
     for(var prop in p){
         c[prop] = p[prop];//如果有属性值是对象,则是把地址复制过去了,
     }
}
extend(person,programer);
console.log(programer.address);//{home: "home address", office: "office address"}
console.log(programer.address.home);//home address
console.log(programer.schools);//["xiaoxue", "daxue"]
programer.name = "sss";
console.log(person.name);//cj
programer.address.name = "xxx";
console.log(person.address.name);//xxx
programer.schools[0] = "iii";
console.log(person.schools[0]);//iii
console.log(person.schools[0]);//iii


=====================================================
//深拷贝,跟父类没关系了
function extendDeeply(p,c){//from --> to 
     var c = c|| {};
     for(var prop in p){//{}形式的对象可以用for in循环,prop是key,p[prop]是每一个value。json和数组都可以用for in循环,数组时候prop是0,,1,2,3,json时候prop是key
         if(typeof p[prop] === "object"){
             c[prop] = (p[prop].constructor ===Array)?[]:{};//c[address]={}
             extendDeeply(p[prop],c[prop]);//p[address],c[address]
            
         }else{
             c[prop] = p[prop];//给c新增一个key和value,c[address][home]=p[address][home]
         }

    }
}

================================================================
function Parent(){
      this.name = "abc";
      this.address = {home:"home"};
}
function Child(){//可以看成类,对象,构造函数,函数执行是相当于构造函数执行但是要return function才产生对象。
     Parent.call(this);//this就有了Parent的属性了,深拷贝
      this.language = "java";
}
var c = new Child();
c.address.home = "ssss"
var p = new Parent();
console.log(p.address.home);//home
=================================================================
    //原型链;java里面的继承关系,一直找到Object类去
    var p ={name:"cj"};
    function myCreate(p){
        var ins ;
        function F(){};
        F.prototype = p;//函数的原型指向p对象,函数公有区域指向p对象,所以ins.__proto__指向p对象,就实现了继承。
        ins =  new F();
        return ins ;
    }
//对象的__proto__ 指向的是
//对象的构造器constructor
//的原型对象(prototype)

//但原型对象并不是能用上面的话来说明
//原型对象的__proto__指向的是Object得prototype
//而不是指向
//其(Object.prototype)构造器constructor ==某个函数
//的原型对象

   function FF(){};
   var ff = new FF(){};
   ff.__proto__ === FF.prototype;//true
    ff.__proto__  === ff.constructor.prototype;  //true
    FF.prototype.__proto__ ===FF.prototype.constructor.prototype; //false

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值