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

原文地址:https://www.cnblogs.com/yaowen/p/6848880.html