使用call()方法实现继承父类属性
<script>
function Person(name,age) {
this.name=name;
this.age=age;
}
Person.prototype.say=function() {
console.log(this.name,"Hello")
}
function Student(name,age,grade){
Person.call(this,name,age)
this.grade=grade;
}
var obj=new Student("hrefan","100","100")
console.log(obj)
</script>
构造函数的继承,只能继承属性,原型的方法是无法继承的
call() 和 apply() 之间的区别
不同之处是:
call() 方法分别接受参数。
apply() 方法接受数组形式的参数。
如果要使用数组而不是参数列表,则 apply() 方法非常方便。
apply()方法
var person = {
fullName: function(city, country) {
return this.firstName + " " + this.lastName + "," + city + "," + country;
}
}
var person1 = {
firstName:"Bill",
lastName: "Gates"
}
person.fullName.apply(person1, ["Oslo", "Norway"]);
原型方法的继承:
如何在Student那里调用say方法:
Student.prototype=new Person();
不好的一点,就是这种方法是强行继承,等于把Penson里面name,age也一并加到Student中,new Person()小括号里面是空白,出来的结果是undefined
既然可以在Penson这个父类身上写方法,那Stundent自然也能写方法:
//也可以在Student身上增加方法:
Student.prototype.Printgrade=function() {
console.log(this.name,this.grade)
}
obj.Printgrade()
//方法增强:
Student.prototype.say1=function() {
this.say()
console.log(this.name,"大家好")
}
obj.say1()
注意方法增强,不能在自己函数里面写this. 不然就是反复调用自身原形,会形成死循环,必须再新建一个方法
this关键字
this:谁调用我,我就指向谁
在方法中,this 表示该方法所属的对象。
如果单独使用,this 表示全局对象。
在函数中,this 表示全局对象。
在函数中,在严格模式下,this 是未定义的(undefined)。
在事件中,this 表示接收事件的元素。
类似 call() 和 apply() 方法可以将 this 引用到任何对象。
显式函数绑定
在 JavaScript 中函数也是对象,对象则有方法,apply 和 call 就是函数对象的方法。这两个方法异常强大,他们允许切换函数执行的上下文环境(context),即 this 绑定的对象。
解析器在调用函数时,每次都会向函数内部传递进隐藏的参数。
根据函数的调用方式的不同,this 会指向不同的对象。
a、以函数的形式调用时,this 永远都是 window。
b、以方法的形式调用时,this 就是调用方法的那个对象。
JavaScript改变this指向的三种方法