JS构造函数

JS基础
6/12/2020 1:38:43 PM

JS中不存在重载,方法名一样的话,后面的会把前面的覆盖掉,最后只保留一个
但js中有重写:子类重写父类的方法
JS中有一个操作类似重载但不是重载:我们可以根据传递参数的不一样的,实现不同的功能

function sum(num){
	if(typeof num === "undefined") {
		return 0;
	}
	return num;
}
sum(100);
sum();  

构造函数模式和工厂模式的区别?

构造函数模式的目的就是为了创建一个自定义类,并且创建这个类的实例

1、执行的时候

普通函数执行->函数名()
构造函数模式->new 函数名()
通过new执行后,我们的CreateJsPerson就是一个类了,JS中所有的类都是函数数据类型的,它通过new执行变成了一个类,但是它本身也是一个普通的函数

var p1=new CreateJsPerson("陈华斯",18)
创建一个数组:

var ary = []; 字面量方式
var ary = new Array(); 实例创建的方式->构造函数模式执行的放式
不管哪种方式ary都是Array这个类的一个实例

1、JS中所有的实例都是对象数据类型的
2、在构造函数模式中,类中(函数体中)出现的this.xxx=xxx中的this是当前类的一个实例,而某一个属性值(方法),方法中的this需要看方法执行的时侯,前面是否有"."才能知道this是谁

function Fn(){
	this.x = 100;
	this.getX = function() {
		//this需要看getX执行的时候才知道
		console.log(this.x);
	}
}
var f1 =new Fn;
f1.getX();   //方法中的this是f1
var ss= f1.getX;
ss();  //方法中的this是window

3、在构造函数模式中new Fn()执行,如果Fn不需要传递参数的话,后面的小括号可以省略

var f1= new Fn;  

4、类有普通函数的一面,的那个函数执行的时候,var num 其实只是当前形成私有作用域中的私有变量而已,它和我们的f1这个实例没有任何的关系;只有this.xxx=xxx才有相当于给f1这个实例增加私有的属性和方法,才和我们的f1有关系…

function Fn(){
	var num = 10;
	this.x = 100;  //f1.x =100
	this.getX = function() {
		//this需要看getX执行的时候才知道
		console.log(this.x);
	}
}
var f1 =new Fn;
console.log(f1.num);  //->undefined  

5、在构造函数模式中,浏览器会默认的把我们的实例返回(返回的是一个对象数据类型的值);如果我们自己手动写了return返回:
返回的是一个基本数据类型的值,当前实例是不变的,例如:return 100;我们的f1还是当前Fn类的实例
返回的是一个引用数据类型的值,当前的实例会被自己返回的值给替换掉,例如:
:return {name:“华溪”} 我们的f1就不在是Fn的实例了,而是对象{name:“华溪”}

function Fn(){
	this.x = 100;
	this.getX = function() {
		console.log(this.x);
	};
	return {name:"华溪"}
}
var f1 =new Fn;
console.log(f1);   

检测某一个实例是否属于这个类->instanceof

console.log(f1 instanceof Fn);//->true
console.log(f1 instanceof Fn);//->false
console.log(f1 instanceof Fn);//->true  

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

in:检测某一个属性是否属于这个对象(attr in object),不管是私有的属性还是公有的属性,只要存在,用in来检测都是true

console.log("getX" in f1);//->true  

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

console.log(f1.hasOwnProperty("getX"));//->true   

利用in和hasOwnProperty来实现检测某一个属性是否为该对象的“公有属性”,hasPubProperty

fuction hasPubProperty(obj,attr){
	//首先保证是它的一个属性并且还不是私有的属性,那么只能是公有的属性了
	return (attr in obj) && !obj.hasOwnProperty(attr);
}
console.log(hasPubProperty(f1,"getX"));  //->false  

isPrototypeOf:检测一个对象是否是另一个对象的原型。或者说一个对象是否被包含在另一个对象的原型链中

var p = {x:1};//定义一个原型对象
var o = Object.create(p);//使用这个原型创建一个对象
p.isPrototypeOf(o);//=>true:o继承p
Object.prototype.isPrototypeOf(p);//=> true p继承自Object.prototype
2、在函数代码执行的时候

相同:都是形成一个私有的作用域,然后形参赋值->预解释->代码从上到下执行(类和普通函数一样,它也有普通的一面)
不同:在代码职系那个之前,不用自己再手动的创建obj对象了,浏览器会默认的创建一个对象数据类型的值(这个对象其实就是我们当前那个类的一个实例)
然后来代码从上到下执行,以当前的实例为执行的主题(this代表的就是当前的实例,然后分别把属性名和属性值赋值给当前的实例
最后浏览器会默认的把创建的实例返回

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值