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

时间:2017-05-24 04:27:39

标签: javascript

我试图理解JavaScript中两个不同函数声明之间的区别。

请考虑以下代码段:

function SomeFunction(){

   this.func1 = function(){
   }

   function func2(){
   }
}

上面的func1和func2的声明有什么区别?

5 个答案:

答案 0 :(得分:4)

用简单的语言, fun1SomeFunction类的属性,其中包含匿名函数的引用,其中func2被命名为function。

  

<强>属性

这里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

答案 1 :(得分:2)

function SomeFunction() {

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

  }
  // Function Declaration
  function func2() {

  }
}

<强>更新

根据您的问题: 在Javascript类中声明函数的最佳方法是什么?

在OOP编程中,Class具有属性和方法。

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

(2)属性:

  • 名称
  • 国家

(1)方法:

  • showPerson1()

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.

如您所见,您可以执行showPerson1()方法,因为使用 this 关键字并使用函数表达式样式来引用Person类。

但是,您无法执行showPerson2()方法,因为此函数的创建方式与对Person类的引用不同。

您可以找到更多信息here

答案 2 :(得分: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

答案 3 :(得分:1)

这种声明函数的方式称为函数表达式。只有在定义函数后才能调用这种函数。函数表达式仅在解释器到达该行代码时加载。

var func1 = function() {
     // Code here
}

这种声明函数的方式称为函数声明。函数声明在执行任何代码之前加载。所以它可以在程序定义之前在程序中的任何地方调用。有理由,请阅读Javascript中的Hoisting

func1 () {
     // Code here
}

在另一个函数中定义这些函数时,函数表达式充当函数的属性,可以使用父函数的对象进行访问。然而,函数声明的范围在父函数内部,因此无法从父函数外部访问它。这是Javascript中非常重要的属性,我们可以模拟 面向对象的自然

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

以下是下面的工作示例,以了解有关它的更多信息。

&#13;
&#13;
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
&#13;
&#13;
&#13;

希望这有帮助! :)

答案 4 :(得分:0)

func1实际上是SomeFunction上的属性,所以基本上你可以做

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

但你做不到

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

因为它没有附加到该类。但是,您仍然可以在班级func2内部使用SomeFunction,但不能在课堂外使用。{/ p>

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

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

希望这有帮助