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()//原型链继承