java和js中的隐式调用
所谓的隐式调用就是一个事件的触发导致了另一模块中的过程的调用,简单来说就是自动调用一些方法,而这些方法像钩子一样可以在外部修改,从而改变既定行为。
java
当你没有使用父类默认的构造方法时,此时在子类的构造方法中就需要显示的调用父类定义的构造方法。
//父类
class Animal{
private String name;
//如果你定义一个新的构造方法
public Animal(String name) {
this.name = name;
}
}
//子类
public Dog extends Animal{
//这是你就要显示的调用父类的构造方法,因为子类默认调用的是父类的
//无参构造方法Animal()
public Dog(){
super("小狗"); //显示调用父类的有参构造方法
.... //子类的构造方法处理
}
}
//当然,如果你在父类里面把无参的构造方法,显示的写出来了,比如:
//父类:
class Animal{
private String name;
//无参的构造方法
public Animal() {
..... //处理
}
//如果你定义一个新的构造方法
public Animal(String name) {
this.name = name;
}
}
//那么在子类的构造方法中,就可以不用显示的调用父类的构造方法,因为子类有个无参的构造方法,子类在构造方法中会自动调用父类已经定义的无参构造方法。
js
数据类型转换 toSting 和 valueOf。
在进行转换运算时会隐式调用上面两个方法
var obj = {
a: 1,
toString: function () {
console.log('toString')
return '2'
},
valueOf: function () {
console.log('valueOf')
return 3
}
}
console.log(obj == '2'); //依次输出 'valueOf' false
console.log(String(obj));//依次输出 'toString' '2'
-----------------------------------------------------------
var obj = {
a: 1,
toString: function () {
console.log('toString')
return '2'
},
valueOf: function () {
console.log('valueOf')
return {} //修改为对象
}
}
console.log(obj == '2'); //依次输出 'valueOf' false
console.log(String(obj));//依次输出 'toString' '2'
在相等运算符的操作中,对象会先调用 valueOf 如果返回的值是一个对象, 就会调用 toSting, null除外,然后用返回的值进行比较,第一个例子 相当于 3 == ‘2’ 输出 false, 第二个例子由于执行valueOf 返回的是一个对象, 然后执行 toString, 最后相当于 ‘2’ == ‘2’ 输出true在 Number 和 String 方法中 Number会先调用 valueOf, 后调用 toString, String方法中是相反的。
数据类型的转换除了上面的两个例子外,还存在在各种其他操作中,如数值运算,当涉及到引用类型时,都会调用valueOf 或 toString 方法,只要是对象都会继承这两个方法,我们可以重新覆盖这两个方法,从而影响数据类型转换的行为