在Javascript类中声明函数的最佳方法是什么?

5
我正在尝试理解JavaScript中两种不同的函数声明之间的区别。
考虑以下代码片段:
function SomeFunction(){

   this.func1 = function(){
   }

   function func2(){
   }
}

上述func1和func2的声明有何区别?

1
如果您从 SomeFunction 实例化一个对象,您将无法从该实例访问 func2。您还应考虑使用SomeFunction.prototype ,这样您就不必为每个单独的实例创建一个自己的函数对象。 - Teemoh
5个回答

5
简单来说,fun1SomeFunction类的一个属性,它持有一个匿名函数的引用,而func2是一个命名函数。

属性

这里的fun1SomeFunction类的一个属性,它意味着只有在你使用new关键字创建SomeFunction类的实例时才能从外部访问它。

私有方法

这里的fun2将作为SomeFunction类的私有方法,在该类中仅可访问。


示例

function SomeFunction() {
  this.func1 = function() { console.log("in func1") }
  function func2() { console.log("in func2") }
}

var obj = new SomeFunction();

obj.func1();  //Accessible 
obj.func2(); //Not accessible


2
function SomeFunction() {

  // Function Expression
  this.func1 = function() {

  }
  // Function Declaration
  function func2() {

  }
}

更新:

根据您的问题:如何在Javascript类中声明函数是最好的方法?

在面向对象编程中,一个类具有属性和方法。

在下面的示例代码中,Person类包含:

(2) 属性:

  • name(姓名)
  • country(国家)

(1) 方法:

  • showPerson1()(显示人物1)

function Person(name, country) {
  // Attributes of Person class.
  this.name = name;
  this.country = country;

  // Function Expression:
  this.showPerson1 = function() {
    var personMessage = "Hi, my name is ";
    personMessage += this.name;
    personMessage += ". I'm from ";
    personMessage += this.country;
    personMessage += ".";
    return personMessage;
  };

  // Function Declaration:
  function showPerson2() {
    var personMessage = "Hi, my name is ";
    personMessage += this.name;
    personMessage += ". I'm from ";
    personMessage += this.country;
    personMessage += ".";
    return personMessage;
  }
}

var person1 = new Person("John", "United States");
console.log(person1.showPerson1()); // Prints: Hi, my name is John. I'm from United States.
console.log(person1.showPerson2()); // Throws an error.

正如您所看到的,您可以使用this关键字并使用函数表达式样式引用Person类来执行showPerson1()方法。
然而,您无法执行showPerson2()方法,因为该函数不是像引用Person类那样创建的。
您可以在此处找到更多信息。

2
这种声明函数的方式被称为函数表达式。这种类型的函数只能在函数定义之后调用。函数表达式只有在解释器到达代码行时才会加载。
var func1 = function() {
     // Code here
}

这种声明函数的方式称为函数声明。函数声明在任何代码执行之前加载。因此,它可以在定义之前在程序中的任何地方调用。想了解原因,请阅读有关JavaScript中的提升的内容。
func1 () {
     // Code here
}

当在另一个函数中定义这些函数时,函数表达式 作为函数的属性,可以使用父函数对象访问。而函数声明的作用域在于父函数内部,因此无法从父函数外部访问。这是JavaScript中非常重要的特性,可以用来模拟面向对象编程

简而言之,函数声明充当类的私有方法,而函数表达式则是公共方法

下面是一个工作示例,可帮助更好地理解它。

function SomeFunction(){
    
  this.func1 = function() {
    console.log('Public function.')
  }
  
  function func2() {
    console.log('Private function.')
  }
  
  this.func3 = function() {
    func2();
  }
  
}

var obj = new SomeFunction();

obj.func1(); // Public Function.
// Can be accessed as it is a Public function
obj.func3(); // Private Function.
// Can be used to access a private function.
obj.func2(); // Error: Uncaught TypeError
// Private function

希望这能帮到你! :)

1
据我所知,您的问题涉及范围。假设您有一个主类调用其他类的函数。也许这些其他类有一个名为 func1 的函数,您需要使用它。但是等一下,您还想在主类中使用名称 func1,而不提及其他类中的全局函数。使用 this.func1 可以让您访问它作为本地函数,因为 .this 指的是本地作用域。
基本上,它允许他在不声明单独变量的情况下存储函数的结果,这很好,因为它只会在函数声明的上下文中临时使用。
额外阅读(或者如果我比喻不恰当):

http://javascriptissexy.com/understand-javascripts-this-with-clarity-and-master-it/ https://www.w3schools.com/js/js_function_invocation.asp


0

func1 实际上是 SomeFunction 上的一个属性,因此您可以这样做

const someClass = new SomeFunction();
someClass.func1()

但你不能这样做

const someClass = new SomeFunction();
someClass.func2()

因为它没有附加到那个类。但是,您仍然可以在类SomeFunction内部使用func2,但不能在类外部使用。

ES6提供了更清晰的语法来理解这一点。

class SomeClass{
  func1(){
    //function body
  }
}

希望这能有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接