function Fn(){ var num = 10; // this -> f1 · this.x = 100; // f1.x = 100 this.getX = function () { // f1.getX = function... // this-> 需要看getX执行的时候才知道 console.log(this.x) } } var f1 = new Fn; console.log(f1.num) // -> undefined f1.getX(); // 100 方法中的this是f1 var ss = f1.getX ss() // undefined 方法中的this是window
1.在构造函数模式中new Fn执行,如果Fn中不需要传递参数的话,后面的小括号可以省略
2.this的问题:在类中出现的this.xxx = xxx中的this都是当前类的实例,而某一个属性值(方法),方法中的this需要看方法执行的时候,前面是否有“.”才能知道this是谁
3.类有普通函数的一面,当函数执行的时候,var num 其实只是当前形成的私有作用域中的私有变量而已,它和我们的f1这个实例是没有任何关系;只有this.xxx = xxx才相当于
给f1这个实例增加私有的属性和方法,才和我们的f1有关系...
function Fn() { this.x = 100; this.getX = function () { console.log(this.x) } return {name:"珠峰"} } var f1 = new Fn; console.log(f1)
4.在构造函数模式中,浏览器会默认的把我们的实例返回(返回的是一个对象数据类型的值);
如果我们自己手动写了return返回:
1)返回的是一个基本类型的值,当前实例是不变的;例如:return 100;f1还是当前Fn类的实例
2)返回的是一个引用数据类型的值,当前的实例会被自己返回的值给替换掉,例如:return {name:"张三"} 我们的f1就不在是Fn的实例了,而是对象{name:"张三"}