这里先执行括号里所有的内容,再执行最外层的window.alert,
所以读到 People.getName2() 时,函数内的alert就先弹出来了,
因为getName2只有一个alert方法,this.name是Object自带的方法,会返回当前对象的全名,
所以弹出显示People,
构造函数People里虽然有this.name,但是构造函数没实例化是无法调用内部的属性,
所以People.getName2() 返回的是undefined,
现在有如下一个Person类:
类中定义了基本属性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
```