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:"张三"}
function Fn() { this.x = 100; this.getX = function () { console.log(this.x) } } var f1 = new Fn;
5.检查某一个实例是否属于这个类 -> instanceof
console.log(f1 instanceof Fn) // true
console.log(f1 instanceof Object) // true 因为所有的实例都是对象数据类型的,而每一个对象数据类型都是Object这个内置类的一个实例,所以f1也是它的一个实例
对于检测数据类型来说,typeof有自己的局限性,不能细分object下的对象,数组,正则...
var a = [];
console.log(a instanceof Array)// true 说明a是一个数组
function Fn() { this.x = 100; this.getX = function () { console.log(this.x) } } var f1 = new Fn; var f2 = new Fn;
6.f1和f2都是Fn这个类的一个实例,都拥有x和getX两个属性,但是这个两个属性是各自的私有属性,所以:
console.log(f1.getX === f2.getX);// ->false
1)in 检测某一个属性是否属于这个对象 (attr in object)不管是私有属性还是共有属性,只要存在,用in来检测都是true
console.log("getX" in f1) // true 是它的一个属性
2)hasOwnProperty: 用来检测某一个属性是否为这个对象的私有属性,这个方法只能检测私有的属性
console.log(f1.hasOwnProperty("getX")); // ->true getX是f1的私有的属性
思考:检测某一个属性是否为该对象的公有属性 hasPubProperty function hasPubProperty (obj,attr){ // 首先保证是它的一个属性并且还不是私有的属性,那么只能是公有的属性 return (attr in obj) && !obj.hasOwnProperty(attr); } hasPubProperty (f1,"getX")// false
7.isPrototypeOf