在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();