一尘不染

JavaScript:Class.method与Class.prototype.method

javascript

以下两个声明有什么区别?

Class.method = function () { /* code */ }
Class.prototype.method = function () { /* code using this.values */ }

是否可以将第一条语句视为静态方法的声明,而将第二条语句视为实例方法的声明,可以吗?


阅读 238

收藏
2020-05-01

共1个答案

一尘不染

是的,第一个函数与该构造函数的对象实例没有关系,您可以将其视为
“静态方法”

在JavaScript中,函数是一对象,这意味着您可以像对待任何对象一样对待它们,在这种情况下,您只需向 函数object 添加属性。

第二个函数,当您扩展构造函数的原型时,将对使用该new关键字创建的所有对象实例可用,并且该函数内的上下文(this关键字)将引用您调用它的实际对象实例。

考虑以下示例:

// constructor function
function MyClass () {
  var privateVariable; // private member only available within the constructor fn

  this.privilegedMethod = function () { // it can access private members
    //..
  };
}

// A 'static method', it's just like a normal function 
// it has no relation with any 'MyClass' object instance
MyClass.staticMethod = function () {};

MyClass.prototype.publicMethod = function () {
  // the 'this' keyword refers to the object instance
  // you can access only 'privileged' and 'public' members
};

var myObj = new MyClass(); // new object instance

myObj.publicMethod();
MyClass.staticMethod();
2020-05-01