面向对象链式写法,原形添加,给内置对象添加的方法

  面向对象:

  1.构造函数里的属性怎么看? 

    谁前面有this谁就是属性

  案例:

  function Person(name,age){

    var num=12;         //他不是a的属性,只是私有作用域的私有变量

    this.name=name;

    this.age=age;

  }

  var a=new Person("张三",20)

  console.log(a)    

  2.如何查找面向对象中的this;

  1.构造函数里的this指向他的实例对象

  2.如果是方法中的this (要分三个步骤,依次执行)

  (找到this)  步骤一:在调用的时候,看方法前面的.(点)  this就指向谁;

  (替换this)    步骤二:将this换成你找到的那个结果

  (精确查找)  步骤三:用原型链查找模式及分析

  案例:

  function Person(){

    this.x=12;

    this.y=30;

    this.gets=function(){

      return this.x     //this不一定指向他的实例对象跟他的调用有关

    }

  }

  Person.prototype.sun=function(){

    return this.x   //第二步在这里翻译为(return a.__proto__.x)

  }

  var a=new Person;

  console.log(a.__proto__.gets())   (解析(按照步骤来一波):方法调用时,指向.前面的。及this指向为a.__proto__,第二步,将this换成a.__proto__,第三步利用原型链查找及分析:

                   this.x=>a.__proto__.x=>Person.prototype.x=>Person.prototype.x  得出结论:原型上没有这个方法       结果为:undefined不是一个函数)

  3.关于构造函数的返回值问题

    构造函数也是函数,每个函数都有返回值,构造函数返回的是this

  4.数组的方法

  1.push()  unshift()  pop()  shift()

  学习内置对象的方法(窍门):

    1.方法的功能

    2.方法的参数

    3.方法的返回值

  链式写法:

  案例:

  var arr=[12,45,36]

  var s=[89]

  console.log(arr.splice(1).concat(s).reverse())

  上面的这种可以通过.实现的多个方法,我们把它叫做链式写法;

  实现原理:每个方法使用完毕之后,不仅可以得到想要的结果,还需要把当前实例对象返回,才可以实现链式写法

  对象分析:以后我们在使用内置方法,出现内置方法报错;

  基本上会有两种情况(1.方法名写错;2.内置方法的归属出错)

  元素的父级

  div#div<HTMLDivElement<HTMLElement<Element<Node<EventTarget<Object

  获取的元素是document的属性;

  document.getElementsByName()  这个方法;

  <p name="p"></p>

  var a=document.getElementsByName("p")

  5.原型的批量添加和直接对象添加的区别

  案例:

  function Person(){

    this.name="张三"

  }

  Person.prototype.age=45;    //原型批量添加

  Person.prototype={              //直接对象添加

    age:56

  }

  如果是批量添加属性,没有改变原型的内存地址(浏览器开辟的)

  如果是以对象形式添加,就会更改原型的内存地址,浏览器开辟的就被销毁了

  6.怎样给内置对象添加方法;

    如果给内值类的的原型添加方法,使用对象形式Array.prototype={sun:function(){}}不起作用,因为浏览器会保护内置对象的原型内存地址不让人为修改,只能使用批量的形式添加方法Array.prototype.sun=function(){}   

  7.拷贝的几种方式

  1.var obj={}

     var obj2=obj    这种写法可以算是拷贝中的一种,但是严格意义上讲,只是将内存地址赋值给了obj2

  2.浅拷贝:就是将一个对象的属性一个一个复制到了另一个对象中去(主要针对第一层)

  案例:

  var obj={

    name:"张三",

    age:20

  }

  var obj2={}

  for(var key in obj){

    obj2[key]=obj[key]

    }

  console.log(obj2);

  3.深拷贝:如果对象中的属性值又是一个引用数据类型,浅拷贝也能实现,浅拷贝还是把引用数据类型的内存地址赋值给空的对象的一个属性,深拷贝将属性值也一个一个遍历赋值;

  案例:

  var obj={

    name:"张三",

    arr=[12,20,36]

    sex:{

      y:12,

      x:24

    }

  }

  var obj2={}

  function extend(oldobj,newobj){

    for(var key in oldobj){

      var item=oldobj[key]    //遍历每个属性的属性值

      if(item instanceof Array){

        newobj[key]=[]

        extend(item,newobj[key])

      }

      else if(item instanceof Object){

        new[key]={}

        extend(item,newobj[key])

      }

      else{

        newobj[key]=item

      }

    }

  extend(obj,obj2)

    

    

  

原文地址:https://www.cnblogs.com/shangjun6/p/10235237.html