类中定义了基本属性name 和age
```
function Person( name, age){
this.name = name||"lorentz"
this.age = age||27
}
```
首先我们给它添加一个实例方法,即通过实例化该类,在类的实例上可以调用的方法
```
function Person( name, age){
this.name = name||"lorentz"
this.age = age||27
}
//定义在原型上的方法 可以在实例上直接调用
Person.prototype.sayAge = function(){
console.log(`my age is ${this.age}`)
}
let p1 = new Person()
p1.sayAge() //my age is 27
```
通过构造函数的原型,定义了一个sayAg方法,所有的实例都可以通过原型链调用该方法。
静态方法即不需要实例化,可以直接利用构造函数调用的方法。在JS中,函数也是一个对象。将构造函数对象的某个属性设置为一个函数即为静态方法:
注意静态方法里this指向构造函数对象Person,而不是构造函数的实例
```
function Person( name, age){
this.name = name||"lorentz"
this.age = age||27
}
//定义在原型上的方法 可以在实例上直接调用
Person.prototype.sayAge = function(){
console.log(`my age is ${this.age}`)
}
Person.staticMethod = function(){
console.log(`i am a static method `) //i am a static method
//静态方法中的this指向Person这个构造函数对象,在该对象里是没有age这个属性的
console.log(`my age is ${this.age}`) // my age is undefined
console.log(this) //[Function: Person] { staticMethod: [Function (anonymous)] }
}
Person.staticMethod()
```
在构造函数里定义私有方法,该方法无法在外部直接访问,通过闭包可以访问该方法
注意此时Person是一个普通函数,返回了一个对象,通过返回的对象可以访问他的私有方法
```
function Person( name, age){
this.name = name||"lorentz"
this.age = age||27
let privateMethod = function(){
console.log(`i am a priviate method`)
}
return {
fn: privateMethod
}
}
let p = Person()
p.fn() //i am a priviate method
```
window.alert(p.getName1()+"\n" + People.getName2() + "\n" + p.getName3())这里先执行括号里所有的内容,再执行最外层的window.alert,
所以读到 People.getName2() 时,函数内的alert就先弹出来了,
因为getName2只有一个alert方法,this.name是Object自带的方法,会返回当前对象的全名,
所以弹出显示People,
构造函数People里虽然有this.name,但是构造函数没实例化是无法调用内部的属性,
所以People.getName2() 返回的是undefined,
在前端开发中我们经用到的操作有很多,比如判断数据类型、去重、深拷贝等等,最近也在整理常用的知识点,便于积累和后期查看,这里呢我对js中数据类型判断方法以及判断结果进行了汇总。
一、汇总表格
二、4种方式说明
1、typeof
对于原始类型:除了null其它都可以显示正确
对于对象的话:除了function 其它均显示为 “object”
2、 instanceof : 内部机制是通过原型链来判断的 方法是 a instanceof b (a是不是b的实例)
针对于对象:可以很明显的区分Array、Date、regExp,但是他们都是Object的实例。所以,instanceof 最好是用来判断两个对象是否属于实例关系, 而不是判断一个对象实例具体属于哪种类型。
3、constructor a.constructor===Function / Symbol / String / Number / Boolean / Object / RegExp / Date
对于原始类型:无法处理null、undefined(这两个会报错)
对于对象:均可以判断
函数的 constructor 是不稳定的,这个主要体现在自定义对象上,当开发者重写 prototype 后,原有的 constructor 引用会丢失,constructor 会默认为 Object
4、 toString
toString() 是 Object 的原型方法,调用该方法,默认返回当前对象的 [[Class]] 。这是一个内部属性,其格式为 [object Xxx] ,其中 Xxx 就是对象的类型。
对于 Object 对象,直接调用 toString() 就能返回 [object Object] 。而对于其他对象,则需要通过 call / apply 来调用才能返回正确的类型信息。
可以判断所有类型: Object.prototype.toString.call(xxx) 对向的话可以直接使用 Object.toString(obj)
三、整理一个可以判断任意数据类型的方法
注意:在es6中用class定义类的时候,通过typeof判断出的结果是Function,而通过Object.toString判断的结果是Object。js中class应该是Function类型,所以这点需要注意。
function getType(para) { //判断任意数据类型
const type = typeof para
if (type === "number" && isNaN(para)) return "NaN"
if (type !== "object") return type
return Object.prototype.toString
.call(para)
.replace(/[\[\]]/g, "")
.split(" ")[1]
.toLowerCase()
}
四、小结
js中数据类型判断的方式有4种:typeof、instance、constructor、toString,typeof简单方便,比较适合原始类型判断,toString繁琐一点但是判断全面,所以这两个的结合判断我是比较推荐的。