js高级总结2

this指向问题
原则是 谁调用 指向谁
1、普通函数中的this 指向window
2、对象方法中的this 指向对象
3、构造函数创建对象的方法中的this 指向new出来的对象
4、定时器中的this  指向window
5、call  apply 调用的this 指向新的值

原型和原型链
1、同一个new创建出来的对象的原型(_proto_)相同 指向共同的对象 -----原型对象(prototype)
2、new创建出来的对象都有_proto_属性 指向这个函数的原型对象
3、所有原型对象的_proto_属性默认指向 Object 
4、Object的_proto_属性指向null
5、各个函数原型对象中又有一个 constructor 指向函数对象
6、所有函数对象的_proto_指向Function原型对象
7、Function原型对象的_proto_指向Object原型对象


对象常用方法

1、instanceof 用于检测变量的指定数据类型

 function Student(name,age){
         this.name=name
         this.age=age
     }
     Student.prototype.show=function(){
         conosole.log(this.name)
     }
     var s1=new Student("王一",21)


    instanceof 检测s1是否为 Student类型
   

  var result=s1 instanceof Student
     console.log(result)

2、isPrototypeOf() 判断对象是否是基于对应构造函数创建   
 

   var result=Student.prototype.isPrototypeOf(s1)
      console.log(result)


3、判断属性的方法 
      .hasOwnProperty(属性名(key)) 判断当前属性 是否存在于 构造函数
4、in 判断对象是否具有对应属性 (key in 对象 )

var r="name"in s1


面试题:编写一个方法,传入一个对象 以及 key值,判断一下当前这个属性是否是存在于原型中的,如果是返回T,如果不是返回F
        属性 : 构造函数  原型中的
        判断当前属性是否存在于对象的原型中 
   

    function hasPrototype(obj,key){
            return key in obj && obj.hasOwnProperty(key)==false
        }

 面向对象编程的特点
    1.抽象性 :通过对象来分析实际问题 
    2.封装性:  属性和方法 都封装到对象  节约开发成本  维护成本  安全 
    3.继承性 :java python 举例子讲解 
    4.多态性: 一个类 可以创建多种对象 ,js中基本用不着         

公开属性 :任何的属性都可以直接访问,以及更改   不安全
私有属性:只能通过方法修改不能直接修改,通过制定的方法 访问以及修改

私有属性

function User(name,upass,phone){
            var upass=upass
            this.name=name
            this.phonenumber=phone
            //定义两个方法 一个用来访问私有属性
            this.getUpass=function(){
                return upass
            }
            //一个用来设置私有属性 
            this.setUpass=function(val){
                var reg=/\d{11}$/
                if(reg.test(val)){
                    upass=val
                }    
            }
        }
        //写到原型上也可以 
        var u1=new User('王一',12346,1523556788)
        u1.setUpass(45645645645)
        var result=u1.getUpass()
        console.log(result)

get访问私有属性
set设置私有属性
通过函数内部的局部变量对于内部函数是全局变量  只能通过方法访问

属性继承
将共有的方法和属性写到父类中 子类可以继承父亲的方法或者属性


1、原型链继承 无法对属性初始化 所有属性都是固定的
 Dog.prototype=new Animal("小黑",12,"红色")

2、冒充继承 通过call 或者apply来改变this的指向 
可以继承构造函数中的内容 无法继承原型 

.call(对象 ,参数1 ,参数2.。。。。。)改变this的指向
.apply(对象,[参数1,参数2,。。。。])改变this的指向 还可以改变传参的方式 统一的用数组
二者使用方法基本相同 apply改变了传参方式 用数组传递

 Animal.call(this,name,age,color) 

Math.max() //一组数中 最大的数 

var max=Math.max(20,50,70,90)
//找出数组中最大的数的方法 
var arr=[20,230,123,124,12]
var max=Math.max(arr)
 var max=Math.max.apply(null,arr)

3、混合继承

function Tiger(name,age,color){
     Animal.call(this,name,age,color) //冒充继承
        }
    Tiger.prototype=new Animal()//原型链继承

Guess you like

Origin blog.csdn.net/m0_60324420/article/details/121734928