私有变量
在对象下变量通过this关键字进行执行,表示通过地址找到对象下的属性和方法,如果要定义私有的属性和方法,可以不通过this关键字定义
例如:
function Emp(age){
var name="小明”//私有变量
this.age=age
}
var e=new Emp(22)
console.log(e.age)
console.log(e.name)
this指向
this关键字用于对象体内,用来指向对象下的属性和方法,方便调用
Global:在node环境下this的全局作用域指向Global
window:在浏览器环境下this的全局作用域指向window
例如:
var a=11
console.log(a)
console.log(window.a)
console.log(this.a)
this的指向和在哪定义,在哪执行都没有关系
函数执行时,看函数前面是否有".",有的话,点前面是谁就指向谁,如果没有就指向window
例如:
var name="我是window"
var obj={
name:"我是obj",
info:function(){
console.log(this.name)
}
}
console.loa(obj.name) //obj
console.log(name)//window
特殊情况
1.当this出现在匿名函数里,永远指向的是window
var name="我是window"
var obj={
name:"我是obi".
info:function(){//匿名函数
return function(){return this.name }
}
}
var n=obj.info()()
console.log(n)//window
2.当给一个dom元素绑定一个事件的时候,事件执行的方法体内,this指向的是当前元素
btn.οnclick=function(){
console.log(this)//指向btn按钮
}
改变this指向
var name="我是window"
var obj={
name:"我是obj",
info:function(){//匿名函数
var th=this //在obj环境下存一个对象
return function(){return th.name }
}
}
var n=obj.info()()
console.log(n) //obj
继承
当子类继承父类对象时,可以直接拿到父类下的属性和方法,无需自己重新定义,减少代码写作,js下是单继承,用原型链实现
原型链
每个构造器都有一个原型对象,原型对象包含一个指向构造器的指针,那么我们让原型对象对象指向另一个对象实例,就会实现机制
例如:
function Father(){
this.name="张三"
this.say=function(){console.log(this.name)}
}
function Son(){
this.age=23
}
Son.prototype=new Father()//继承
var s=new Son()
console.log(s.name)//可以调用父类的属性和方法
多态-重写
子类和父类下有相同的方法执行不同的操作,默认执行过程是,先找自己下的属性或方法来执行,没有则去父类下找属性和方法,如果出现重名情况,则子类会覆盖父类方法
例如:
function Father(){
this.name="张三"
this.say=function(){console.log("唱京剧")}
}
function Son(){
this.age=23
this.say=function(){console.log("唱流行歌曲")}
}
Son.prototype=new Father()//继承
var s=new Son()
s.say()//调用自己的方法,覆盖了父类的
改变this指向方法->call,apply,bind
三个函数本身是用来改变this指向的,可以在任何对象下使用,在继承关系里,我们一般用他们来调用父类构造器,只不过定义上有区别
调用对象.call(改变的对象,值1,值2,……)call定义多个参数
调用对象.apply(改变的对象,[值1,值2,……])apply之定义对象和数组
调用对象.bind(改变的对象,值1,值2,……)()bind返回一个函数自己手动执行
例如:
function Father(name,sex){
this.name=name
this.sex=sex
}
function Son(name,sex,age){
//Father.call(this,name,sex)
//Father.apply(this,[name,sex])
Father.bind(this,name,sex)()
}
Son.prototype=new Father()//继承
var s=new Son("张明","男",12)
console.log(s.name)
console.log(s.sex)
console.log(s.age)//可以输出构造器里的赋值
原型链的关键字
prototype:用来指向对象原型
_proto_:用来指向当前实例所属对象
constructor:用来指向构造器
实例有_proto_关键字,对象有prototype和constructor,构造器有prototype