方法

1.对象方法:

function product(name, price) {
  this.name = name
  this.price = price
  this.introduce = function() {
    console.log("This product's name is: " + this.name)
  }
}

对象方法如名字所说,本质还是一个对象(Object). 不过可以用作一个类(class),可以通过 new 来实例化一个对象var car = new product('car',500000),其中 product 方法中的 this 因此将指针指向了 car

2.类方法(本质是静态方法)

product.price = fucntion(){
  console.log('The price is :' + this.price);// this -> product
}

可以看作这个函数本身添加了一个名为 price 属性函数(方法),但是在实例化过程中他不会被携带给实例,因为他没有办法传递(前面的传递是通过 this 指针来操作的)

3.原型方法

product.prototype.say = function() {
  console.log("The product named " + this.name + "values $" + this.price)
}

总结: 对象方法含有 this, 类方法根据对象名添加, 原型方法 class.prototype.func 看一下就行啦

代码示例(对象 VS 类方法)

var BaseClass = function() {
  //对象方法
  this.f1 = function() {
    console.log(" This is a object function.")
  }
}
BaseClass.f2 = function() {
  //静态方法(类方法)
  console.log(" This is a static method ")
}
BaseClass.f2()

var instance1 = new BaseClass() //实例化

instance1.f1()
try {
  instance1.f2() //instance1.f2 is not a function
} catch (err) {
  console.log("---Error:---\n" + err + "\n----")
}

console.log(Object.getOwnPropertyNames(instance1)) //[ 'f1' ]

同名情况

只考虑对象方法和原型方法同名,类方法上面已经讨论,不纠结=. =

var product = function(name) {
  this.func = function() {
    this.name = name
    console.log(1)
  }
}
var car = new product()
product.prototype.func = function() {
  console.log(2)
}
car.func() //  1
delete car.func
car.func() //  2

只有在内置的对象方法被删除之后,语法才会去沿着原型链向上寻找同名函数

实例调用类方法

object.price.call(object)

利用all或者apply调用过来(个人理解这是将词法作用域/上下文环境复制过来的意思)

Reference

javascript 中静态方法、实例方法、内部方法和原型的一点见解_linder0209 JavaScript 类方法,对象方法(this),原型方法(prototype)_hi-docs JS 中的 prototype_轩脉刃