案例(注意:注释不一定正确,仅供参考):
function foo() {
foo.a = function() {
console.log(1);
};//给foo添加属性。
this.a = function() {
console.log(2);
};
// 不推荐使用无var的声明方式
a = function() {
console.log(3);
};//foo函数执行的时候,先给a赋值,然后被下一句覆盖。注意:如果没有下一句代码,这一句代码等于给全局声明了一个a函数。
var a = function() {
console.log(4);
};//预解析,变量提升,foo函数执行的时候,上一句代码先给a赋值,然后这一句再覆盖。
};
foo.prototype.a = function() {
console.log(5);
};//new 的实例才会有此方法
foo.a = function() {
console.log(6);
};//此时foo作为对象使用,这句代码给对象foo添加了一个a属性,该属性值为一个方法
foo.a();//6,调用对象的属性
var obj = new foo();//new了实例,此时foo是作为构造函数使用,该实例具有构造函数原型上的方法。并且这句代码执行后改变了对象foo的a属性,因为这句代码是在foo.a = function() {console.log(6);};这句代码后边执行的。
obj.a();//2,自身有a不会再去原型上找了。
foo.a();//1,被new实例的时候修改了a属性。
知识点:
1,赋值操作会执行。
2,在构造函数中声明的变量在实例函数中是访问不到的。
3,自调用函数、匿名函数,定时器,计时器里面的this都是指向window
以上内容仅作为个人学习记录使用。