构造函数(拓展)

构造函数(拓展)

案例四
普通函数格式
function Fn(){
    
    
};
Fn();

构造函数格式
function Fn(){
    
    
};
var f1= new Fn();
>>var f1= new Fn;
1、在构造函数模式中,new Fn()执行,如果不需要传参数,后面的()可以省略
案例五
function Fn(){
    
    
this.x=100
>>this>>f1
this.getX=function(){
    
    
console.log(this.x);
>>this>>需要看getX执行的时候才知道
}
};
var f1= new Fn();
2、在类中出现的this.xxx=xxx中的this都是当前类的实例,而某个属性值(方法),方法中的this需要看方法执行的时候,前面是否有"."才可以知道this是谁
案例六
var f1=new Fn;
f1.getX();
>>方法中的this是f1>>100
var ss=f1.getX;
ss();
>>方法中的this是window>>undefined
3、类函数有普通函数的一面,当函数执行的时候,var num其实只是当前形成的私有作用域中的私有变量而已,它和我们的f1这个实例没有任何的关系,只有this.xxx=xxx才相当于给f1这个实例增加私有的属性和方法,才和我们的f1有关系
案例七
function Fn(){
    
    
var num=10;
this.x=100;
>>f1.x=100
this.getX=function(){
    
    
>>f1.getX=function...
console.log(this.x);
}
}
var f1=new Fn;
console.log(f1.num);
>>undefined
4、在构造函数中,浏览器会默认的把我们的实例返回(返回的是一个对象数据类型的值);如果我们手动写了retur返回:

返回的是一个基本数据类型的值,当前的实例是不变的,例如:return 100;我们的f1还是当前的Fn类的实例

返回的是一个引用数据类型的值,当前的实例会被自己返回的值给替换掉,例如:return {name:“小黑”};我们的f1就不再是Fn的实例了,而是对象return {name:“小黑”};的实例

案例八
function Fn(){
    
    
this.x=100;
this.getX=function(){
    
    
console.log(this.x);
};
// return 100;>>不变
return {
    
    name:"小黑"};
}
var f1=new Fn;
console.log(f1);
5、检测某一个实例是否属于这个类>>instanceof
案例九
console.log(f1 instanceof Fn);>>true
console.log(f1 instanceof Array);>>false
console.log(f1 instanceof Object);>>true

因为所有的实例都是对象数据类型的,而每一个对象数据类型都是Object这个内置类的一个实例,所以f1也是它的一个实例

对于检测数据类型来说,typeof有自己的局限性,不能细分object下的对象、数组、正则…

案例九拓展
var a=[];
console.log(a instanceof Array);
>>true>>说明a是一个数组
6、f1和f2都是Fn这个类的一个实例,都拥有x和getx两个属性,但是这两个属性是格子的私有属性,所以:console.log(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;

hasOwnProperty:用来检测某一个属性是否为这个对象的“私有属性”,这个方法只能检测私有的属性,

console.log(f1.hasOwnProperty("getX"));
>>true "getX"是f1的私有的属性

思考:检测某一个属性是否为该对象的“公共属性” hasPubProperty

案例十拓展
function hasPubProperty(obj,attr){
    
    
return(attr in obj) && !obj.hasOwnProperty(arrt);
>>首先保证是它的一个属性并且还不是私有的属性,那么只能是公有的属性了
}
console.log(hasPubProperty(f1,"getX"));
>>false
7、isPrototypeof

dir(Object.prototype)>>object

猜你喜欢

转载自blog.csdn.net/yilingpupu/article/details/105486250
今日推荐