我更喜欢在大型项目中使用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类和隐私的文章) 兼容性表-类 巴别塔-班级

其他回答

因为我不承认YUI/Crockford工厂计划,因为我喜欢保持事物自我包含和可扩展,这是我的变化:

function Person(params)
{
  this.name = params.name || defaultnamevalue;
  this.role = params.role || defaultrolevalue;

  if(typeof(this.speak)=='undefined') //guarantees one time prototyping
  {
    Person.prototype.speak = function() {/* do whatever */};
  }
}

var Robert = new Person({name:'Bob'});

理想的测试类型是在第一个方法原型上

我认为你应该阅读Douglas Crockford的《JavaScript中的原型继承》和《JavaScript中的经典继承》。

来自他的页面的例子:

Function.prototype.method = function (name, func) {
    this.prototype[name] = func;
    return this;
};

效果吗?它将允许你以更优雅的方式添加方法:

function Parenizor(value) {
    this.setValue(value);
}

Parenizor.method('setValue', function (value) {
    this.value = value;
    return this;
});

我也推荐他的视频: 先进的JavaScript。

你可以在他的个人主页http://javascript.crockford.com/上找到更多视频 在John Reisig的书中,你可以从Douglas Crockfor的网站上找到许多例子。

简单的方法是:

function Foo(a) {
  var that=this;

  function privateMethod() { .. }

  // public methods
  that.add = function(b) {
    return a + b;
  };
  that.avg = function(b) {
    return that.add(b) / 2; // calling another public method
  };
}

var x = new Foo(10);
alert(x.add(2)); // 12
alert(x.avg(20)); // 15

这样做的原因是,如果您将一个方法作为事件处理程序提供,那么它可以绑定到其他东西,因此您可以在实例化期间保存该值,并在以后使用它。

编辑:这绝对不是最好的方法,只是一种简单的方法。我也在等待好的答案!

一个基地

function Base(kind) {
    this.kind = kind;
}

一个类

// Shared var
var _greeting;

(function _init() {
    Class.prototype = new Base();
    Class.prototype.constructor = Class;
    Class.prototype.log = function() { _log.apply(this, arguments); }
    _greeting = "Good afternoon!";
})();

function Class(name, kind) {
    Base.call(this, kind);
    this.name = name;
}

// Shared function
function _log() {
    console.log(_greeting + " Me name is " + this.name + " and I'm a " + this.kind);
}

行动

var c = new Class("Joe", "Object");
c.log(); // "Good afternoon! Me name is Joe and I'm a Object"

JavaScript是面向对象的,但它与其他面向对象语言(如Java、c#或c++)有根本不同。不要试图那样去理解它。丢掉旧知识,重新开始。JavaScript需要不同的思维。

我建议你去找一本好的手册之类的。我自己发现ExtJS教程是最适合我的,尽管我在阅读它之前或之后没有使用过这个框架。但它确实很好地解释了在JavaScript世界里什么是什么。对不起,似乎该内容已被删除。这里是archive.org的链接。今天工作。: P