在javascript中调用函数的最佳方法

在javascript中调用函数的最佳方法,javascript,ecmascript-6,Javascript,Ecmascript 6,我正在编写一个小示例,调用函数getAge(),通过对象显示年龄 我有三种方法: “严格使用”; var personClass=class{ 静态getAge(){ 返回18 } }; var personJSON={ getAge:function(){ 返回18 } }; 函数personFunc(){ var getAge=函数(){ 返回18 }; //设置一个标志以指向getAge函数 this.getAge=getAge() } $('#btn1')。单击(函数(){ 警报(pe

我正在编写一个小示例,调用函数
getAge()
,通过对象显示年龄

我有三种方法:

“严格使用”;
var personClass=class{
静态getAge(){
返回18
}
};
var personJSON={
getAge:function(){
返回18
}
};
函数personFunc(){
var getAge=函数(){
返回18
};
//设置一个标志以指向getAge函数
this.getAge=getAge()
}
$('#btn1')。单击(函数(){
警报(personClass.getAge())
});
$('#btn2')。单击(函数(){
警报(personJSON.getAge())
});
$('#btn3')。单击(函数(){
var p=新的personFunc();
警报(p.getAge)
});

通过课堂获得年龄
通过json获取年龄

通过函数获取年龄
我建议这样做。我很想听到别人的反馈

//Convention says use capital case if declaring a function as a class. 
function Person(age){

    //Optional: allow the developer to pass in an age when creating the object
    //Otherwise default to 18
    this.age = age? age: 18;      //ternary operator

    //function declaration. 
    this.getAge = function() {
        return this.age; 
    }

}

$('#btn3').click(function () {
  var p = new Person();
  alert(p.getAge())     //Alert 18

  var p2 = new Person(15);
  alert(p2.getAge())    //Alert 15
});
我的理由是,这是一种面向对象的方法

  • 大写字母使您知道此函数用于带有
    new
    关键字的

  • 可重用-您可以拥有多个不同年龄的
    Person
    对象,而无需每次为每个对象声明方法

  • 语法和用法类似于人们可能已经熟悉的面向对象语言,如Java


    • 我推荐最简单的形式:

      var personJSON = {
        getAge: function () {
          return 18;
        }
      };
      
      它已经创建了一个具有所需属性的定义良好的对象,它具有良好的伸缩性,并且不会受到繁文缛节样板代码的阻碍

      好的代码已经这么做了很多年,而且它是一种经过充分验证的风格。它可读性强,结构紧凑

      您无法从中获得的是ES6类定义的新高级功能,在更高级的情况下可能需要这些功能

      警告!这只是我个人的偏见:

      一、 首先,我将完全不使用类定义,相反,我将利用这种风格和lambdas,就像我10多年来一直做的那样。我也反对在Javascript中引入语法糖只是为了让它看起来像其他语言。我更喜欢原型范式


      你最后的写作方式是最好的

      function personFunc() {
        var getAge = function () {
          return 18
        };
      
        // set a flag to point to getAge function
        this.getAge = getAge()
      }
      
      但有一个更好的表现,但小复杂的写作。这就像TypeScript或Babel将其类编译为JavaScript一样

      function PersonClass() {  
         this.age = 18;
      }
      
      PersonClass.prototype.getAge = function () {
       return this.age;
      };
      
      用法相同:

      var person = new PersonClass();
      person.getAge();
      
      但是,像这样一个人写作并不费时。所以我认为现在最好的办法是使用ES6类并用TypeScript或Babel编译它们

      因此,我的观点是最好的写作方式:

      class PersonClass {
         private age = 18; 
         getAge() {
            return this.age;
         }
      }
      

      这取决于你必须解决的实际问题和你正在使用的编程风格。如果您倾向于使用面向对象的方法,并且希望从它的特性(如继承)中获益,那么您可能希望将一个人建模为

      function Person(){
          var age = 18;
          this.getAge = function() {
              return age; 
          }
      }
      
      var person = new Person();
      alert(p.getAge());
      
      或者作为一个班级

      class Person {
        constructor() {
          this.age = 18;
        }
      
        getAge() {
          return this.age()
        }
      }
      
      如果您更喜欢功能性更强的样式,那么您将编写对某些数据执行某些操作的纯独立函数:

      // does not make much sense in this age of a person context
      function age(obj, dateFn) {
          return dateFn() - obj.born;
      }
      
      var person = { born : new Date(/* */) }
      var animal = { born : new Date(/* */) }
      alert(age(person, Date.now));
      alert(age(animal, Date.UTC));
      

      对于
      getAge
      的示例,任何类型的静态函数都没有任何意义(您的第一个示例),因为
      age
      是某个对象的属性。所以你需要一个对象的实例,你可以用它来调用一个方法,或者传递给一个函数。

      我只是说如何使用这三个。这不是一个绝对的答案,这是我看待事物的方式。我很想看看其他人对此的看法

      class
      如果我想多次实例化这个对象,我只会使用这个关键字。(仅在ECMAScript 6中可用)


      JSON
      我只声明一个JSON,而我只将它实例化一次

      var Game = {
        run: function() {
          //...
        },
        stop: function() {
          //...
        },
        pause: function() {
          //...
        },
        maxPlayer: 4,
        rooms: [{
          roomName: "Room1",
          playerNames: ["Player1", "Player2"]
        }, {
          roomName: "Room2",
          playerNames: ["Player1", "Player2", "Player3"]
        }]
      };
      

      功能
      您在这里使用它更像是一个
      替代品。通过使用
      new
      关键字,可以根据需要多次将此函数实例化为类。(很多人都这么做,没关系!主要是因为关键字
      class
      仅在ECMAScript 6中可用)


      我会说第二个,尽管它与JSON无关。问得好。我想这取决于你在做什么。虽然可能有一个有趣/令人惊讶的答案。静态类级别的
      getAge
      func没有多大意义,因为年龄是一个人(实例)的属性,而不是所有人的属性。这真的取决于实际情况……这个问题要么太宽泛,要么主要基于观点。依我看,你的
      2nd
      是在这种情况下实现对象的最佳方式。如果您实现了多个对象,那么您的
      3rd
      是混淆下一个程序员的最佳方式。你的
      1st
      是拥有数百个
      静态getter
      而根本没有
      setter
      的最佳方式。如果我们只考虑性能,他应该只编写
      警报(18)
      ;我宁愿在
      PersonClass
      中添加一个
      构造函数。因为年龄并不是所有人所独有的,我们至少应该能够通过setter.TypeScript为我们添加构造器:)类语法就是:syntax。所以我想知道你说的那些“阶级特征”是什么。我没有恰当地表达我自己。我并没有打算使用句法上的糖分,而是使用与之无关的“得者”和“二传者”。我无意中混淆了这些,谢谢你指出这一点。
      
      var Game = {
        run: function() {
          //...
        },
        stop: function() {
          //...
        },
        pause: function() {
          //...
        },
        maxPlayer: 4,
        rooms: [{
          roomName: "Room1",
          playerNames: ["Player1", "Player2"]
        }, {
          roomName: "Room2",
          playerNames: ["Player1", "Player2", "Player3"]
        }]
      };
      
      var Person = function (firstName) {
        this.firstName = firstName;
      };
      
      Person.prototype.sayHello = function() {
        console.log("Hello, I'm " + this.firstName);
      };
      
      var person1 = new Person("Alice");
      person1.sayHello();