下面还有一句
Foo.a()
首先定义了一个构造函数Foo,但是还未执行。然后分别在Foo的原型对象和私有属性中添加了一个a方法,此时执行Foo.a()则先从私有属性中找,输出4.
注意
let obj=new Foo()
这个赋值语句会执行一次构造函数,而构造函数Foo()中第一条语句把Foo这个对象(我们可以把它看作一个普通的对象,构造函数也是一种对象)的私有属性a重新赋值,下一条赋值语句则是给obj添加了一个私有属性a,执行obj.a()时首先找到私有属性,打印的是2
function Foo(){
Foo.a=function(){
console.log(1)
} //此时Foo.a已经指向了另一个函数,再执行Foo.a()时会打印1
this.a=functon(){
console.log(2)
}//obj=new Foo()那么this就是obj,a是obj的私有属性,执行obj.a()时首先找到私有属性,打印的是2
}
另外 只有当使用new创建一个实例时,该实例才会继承构造函数原型上的属性,否则就只有构造函数本身的属性
总结