我更喜欢在大型项目中使用OOP,比如我现在正在做的项目。我需要在JavaScript中创建几个类,但是,如果我没有弄错的话,至少有几种方法可以做到这一点。它的语法是什么,为什么要这样做?
我希望避免使用第三方库——至少一开始是这样。 为了寻找其他答案,我找到了一篇文章《JavaScript面向对象编程,第一部分:继承- JavaScript文档》,它讨论了JavaScript中的面向对象编程。是否有更好的继承方式?
我更喜欢在大型项目中使用OOP,比如我现在正在做的项目。我需要在JavaScript中创建几个类,但是,如果我没有弄错的话,至少有几种方法可以做到这一点。它的语法是什么,为什么要这样做?
我希望避免使用第三方库——至少一开始是这样。 为了寻找其他答案,我找到了一篇文章《JavaScript面向对象编程,第一部分:继承- JavaScript文档》,它讨论了JavaScript中的面向对象编程。是否有更好的继承方式?
当前回答
ES2015类
在ES2015规范中,你可以使用类语法,它只是原型系统的糖纸。
class Person {
constructor(name) {
this.name = name;
}
toString() {
return `My name is ${ this.name }.`;
}
}
class Employee extends Person {
constructor(name, hours) {
super(name);
this.hours = hours;
}
toString() {
return `${ super.toString() } I work ${ this.hours } hours.`;
}
}
好处
主要的好处是静态分析工具发现更容易定位这种语法。对于那些来自基于类的语言的人来说,使用这种语言作为一种多语言也更容易。
警告
要警惕它目前的局限性。要实现私有属性,必须使用符号或弱映射。在未来的版本中,类很可能会被扩展,以包含这些缺失的特性。
支持
目前浏览器的支持还不是很好(除了IE,几乎所有浏览器都支持),但是现在你可以通过像Babel这样的编译器来使用这些特性。
资源
ECMAScript 6中的类(最终语义) 什么?等待。真的吗?哦,不!(一篇关于ES6类和隐私的文章) 兼容性表-类 巴别塔-班级
其他回答
下面是不使用任何外部库的方法:
// Define a class like this
function Person(name, gender){
// Add object properties like this
this.name = name;
this.gender = gender;
}
// Add methods like this. All Person objects will be able to invoke this
Person.prototype.speak = function(){
alert("Howdy, my name is" + this.name);
};
// Instantiate new objects with 'new'
var person = new Person("Bob", "M");
// Invoke methods like this
person.speak(); // alerts "Howdy, my name is Bob"
真正的答案要比这复杂得多。例如,在JavaScript中没有类这种东西。JavaScript使用基于原型的继承方案。
此外,还有许多流行的JavaScript库,它们在JavaScript中具有类似类的功能。您至少需要了解Prototype和jQuery。
决定哪一个是“最好的”是在Stack Overflow上开始一场圣战的好方法。如果您正在着手一个较大的javascript较多的项目,那么学习一个流行的库并按照它们的方式来做绝对是值得的。我是一个原型的人,但Stack Overflow似乎倾向于jQuery。
至于只有“一种方法可以做到这一点”,不依赖任何外部库,我写的方法就差不多了。
ES2015类
在ES2015规范中,你可以使用类语法,它只是原型系统的糖纸。
class Person {
constructor(name) {
this.name = name;
}
toString() {
return `My name is ${ this.name }.`;
}
}
class Employee extends Person {
constructor(name, hours) {
super(name);
this.hours = hours;
}
toString() {
return `${ super.toString() } I work ${ this.hours } hours.`;
}
}
好处
主要的好处是静态分析工具发现更容易定位这种语法。对于那些来自基于类的语言的人来说,使用这种语言作为一种多语言也更容易。
警告
要警惕它目前的局限性。要实现私有属性,必须使用符号或弱映射。在未来的版本中,类很可能会被扩展,以包含这些缺失的特性。
支持
目前浏览器的支持还不是很好(除了IE,几乎所有浏览器都支持),但是现在你可以通过像Babel这样的编译器来使用这些特性。
资源
ECMAScript 6中的类(最终语义) 什么?等待。真的吗?哦,不!(一篇关于ES6类和隐私的文章) 兼容性表-类 巴别塔-班级
如果你想要简单,你可以完全避免“new”关键字,只使用工厂方法。有时我更喜欢这样,因为我喜欢使用JSON创建对象。
function getSomeObj(var1, var2){
var obj = {
instancevar1: var1,
instancevar2: var2,
someMethod: function(param)
{
//stuff;
}
};
return obj;
}
var myobj = getSomeObj("var1", "var2");
myobj.someMethod("bla");
不过,我不确定大对象的性能会受到什么样的影响。
代码高尔夫@liammclennan的答案。
var Animal = function (args) { 返回{ 名称:args.name, getName:函数{ 返回this.name;//成员访问 }, callGetName:函数(){ 返回this.getName ();//方法调用 } }; }; var cat =动物({名字:'老虎'}); console.log (cat.callGetName ());
var Animal = function(options) {
var name = options.name;
var animal = {};
animal.getName = function() {
return name;
};
var somePrivateMethod = function() {
};
return animal;
};
// usage
var cat = Animal({name: 'tiger'});