1、要了解面向对象的思想我们需要了解构造函数模式,首先创建一个类;
function Fn(){ this.x = 100;//this->f1; this.getX = function(){ console.log(this.x);//this->要看getX执行的时候才知道; } } var f1 = new Fn; f1.getX();->方法中的this是f1 输出100; var s = f1.getX;->把f1对应的属性名为getX后面的函数的属性值赋值给s; s();->this是window,输出undefined;
2.类具有普通函数一面,当函数执行时var 的num 其实只是当前形成的私有作用域中的私有变量而已,它和f1 这个实例没有任何关系; 只有this.xxx=xxx,才相当与给f1这个实例增加方法; function Fn(){ var num = 10; this.x = 100; this.getX = function(){ console.log(this.x); } } var f1 = new Fn; console.log(f1.num)-> undefined;
3.在构造函数模式中,浏览器会默认把实例返回(返回的是一个对象数据类型的值),如果自己手动写了return返回, //返回的是一个基本数据类型的值,当前实例不变;例如 return 100; //返回的是一个引用数据类型的值,当前的实例的值会被替换掉;return {name:"hello"} f1 就不是Fn的实例了;而是对象{name:"hello"} function Fn(){ this.x = 100; this.getX = function(){ console.log(this.x) } return {name:"hello"} } var f1 = new Fn; console.log(f1);
4.f1和f2都是Fn这个类的实例,都拥有x和getX两个属性,但是这两个属性有各自的私有属性,所以f1.getX === f2.getX->false; function Fn(){ this.x = 100; this.getX = function(){ console.log(this.x) } var f1 = new Fn; var f2 = new Fn;
//in:检测某一个属性是否属于这个对象;attr in object;
console.log("getX" in f1)->true;