理解js中的实例方法,原型方法、静态方法和内部方法
刚学构造函数和他的实例以及一系列方法真的搞了好久才明白。
首先要明白实质上属性和方法是一样的,方法是属性为引用型的函数。
内部方法
定义在函数内部的方法,内部方法只能被内部的方法调用
function Person(){
var work=function(){
console.log('内部方法')
}
}
console.log(work)//work is not defined
静态方法
静态方法:是直接在构造函数上定义的方法,不能被实例调用,自身可以调用
function Person() {
}
Person.sing=function(){
console.log('singing')
}
var p=new Person()
p.main='sss'//给实例添加属性
console.log(p.main)//sss
Person.sing()//singing
p.sing()//报错:baUncaught TypeError: p.sing is not a function
原型方法
通过prototype属性在构造函数上添加的方法
function Person() {
}
Person.sing=function(){
console.log('singing')
}
Person.prototype.eat=function(){
console.log('eating')
}
var p=new Person()
Person.prototype.eat()//eating
p.eat()//eating
实例方法
因为在构造函数中this指向的是他的实例对象,所以定义在this中的变量和方法,只有实例才能访问到,无法通过构造函数直接调用。
function Person(name,age) {
this.name=name
this.age=age//name,age为实例变量
this.dance=function(){//实例方法
console.log('dancing')
}
console.log(this)//Person {name: "lily", age: 20, dance: ƒ}
}
var p=new Person('lily',20)
console.log(p.name,p.age)//lily 20
p.dance()//dancing
Person.dance()//Uncaught TypeError: Person.dance is not a function
综合来看一下这些方法的使用吧
function Person(name,age) {
this.name=name
this.age=age//name,age为实例变量
this.dance=function(){//实例方法
console.log('dancing')
}
var fn=function(a,b){//内部方法
return a+b
}
var obj={//函数内部对象
name:'lucy',
age:18,
fn2:function(){
return fn(1,2)
}
}
console.log(obj.fn2())//3
}
Person.sing=function(){//静态方法
console.log('singing')//singing
}
Person.prototype.eat=function(){//原型方法
console.log('eating')
}
var p=new Person('lily',20)//构造实例
console.log(p.name,p.age)//lily 20
Person.prototype.eat()//eating
p.eat()//eating
p.main='sss'//实例属性
console.log(p.main) //sss
p.sing=function(){//实例方法
console.log('sing')
}
p.sing()//sing
Person.sing()//singing