JavaScript:Class.method 与 Class.prototype.method

标签 javascript oop prototype-programming

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

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

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

最佳答案

是的,第一个函数与 constructor function 的对象实例没有关系,您可以将其视为'静态方法'

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

第二个函数,当您扩展构造函数原型(prototype)时,它将可用于使用 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();

关于JavaScript:Class.method 与 Class.prototype.method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1635116/

相关文章:

javascript - jQuery iframe 加载 JavaScript 内容 - 上下文

javascript - iframe 完成加载后加载指示器保留在 Firefox 中

c# - 如何在 OOP 中模拟类似银行的账户?

Javascript:使用预先存在的对象值作为新对象的键

javascript - 中断原型(prototype)函数传播

javascript - HTML5 视频播放器 - video.js - Chromium 和 Mozilla Firefox 上视频播放结束时的不同行为

javascript - 每次我点击一个项目它被添加到购物车。我需要在 Angular js 中添加新的 `item` 之前删除以前添加的项目

java - Java 中使用局部变量隐藏实例变量

c++ - 我们在A(派生类) "is a"B(基类)时使用继承。当A "can be"B或C时我们怎么办?

javascript - 在 JavaScript 中构建类的正确方法?