什么是创建一个Javascript类的正确方法是什么?(What is the correct wa

2019-07-29 14:26发布

我试图找出如何正确地构建我的JavaScript类(或单一对象)。

var obj = new Object();
obj.foo = 'bar';
obj.method = function() { ...}

var obj = {
    foo : 'bar',
    method : function() { ...}
}

var obj = function(){}
obj.prototype = {
    foo : 'bar',
    method: function() { ... }
}

我希望能够设置几个属性和分配方法可用。 我也想能够使用的东西像混入上的对象,所以我可以用的东西像延长这些对象的事件 。

Answer 1:

我试图找出如何正确地构建我的JavaScript类(或单一对象)。

有那些(“类”和单一对象)之间有很大的区别。 你的第一对夫妇的例子是一次性的对象(单身)。 你的第三个(最后一个)的例子创建一个构造函数 ,可以让你创建多个对象共享相同的原型。 我会建议增强prototype在构造函数属性,而不是取代它,你在做什么,例如:

var Thingy = function() {   // Or use a function declaration rather than expression
    // Optional initialization code here
};
Thingy.prototype.foo = 'bar';
Thingy.prototype.method = function() {
    // Method code here
};

(构造的功能,按照惯例,开始与大写字母)。

您使用(单身或构造函数)取决于你所需要的。

作为ES2015(又名“ES6”),它的简单,虽然有定义为非方法原型属性(你没有新的语法foo ); 有可能会在ES2017或ES2018,一旦这个建议向前移动,但在那之前:

class Thingy {
    constructor() {
        // Optional initialization code here
    }
    method() {
    // Method code here
    }
}
Thingy.prototype.foo = 'bar';

如果您需要进入继承层次,在旧ES5语法有涉及水暖公平一点:

var Base = function() {
};
Base.prototype.method = function(arg1) {
    // ...
};

var Derived = function() {
    Base.call(this);
};
Derived.prototype = Object.create(Base.prototype);
Derived.prototype.constructor = Derived;
Derived.prototype.method = function(arg1) {
    // Using Base's `method`, if desired, is a bit ugly:
    Base.prototype.method.call(this, arg1);
};

...这就是为什么你见惯了图书馆在加强,像原型的Class的东西,或者我自己的天堂 ; 那些被ES2015语法过时,不过,whcih使得它彻头彻尾的容易:

class Base {
    method(arg1) {
        // ...
    }
}
class Derived extends Base {
    method(arg1) {
        // Use's the superclass's `method`, if desired, is easy:
        super.method(arg1);
    }
}

再你的问题的标题

什么是创建一个Javascript类的正确方法是什么?

有使用JavaScript创建对象的“类”多次平分,正确的方法,因为JavaScript是一种非常灵活的语言。 有标准的构造函数,“建设者”的功能, Object.create (启用ES5的环境),它可以让你做的更直接的原型继承,和其他几个人。 一个关于JavaScript的伟大的事情是,你可以选择你的“下课”的风格。



Answer 2:

你也可以使用这样的:

function O(x,y) {
   this.x=x;
   this.y=y;
   this.method=function() {...}
   return this;
}

var o=new O(0,0);


Answer 3:

如果你正在寻找一个切实可行的解决方案,而不是理论上的,你最好使用一个框架。

  • Backbone.js的拥有你所需要的,包括混合类型和事件系统。

如果你需要一些小部件也考虑

  • 的Qooxdoo
  • ExtJS的

他们都提供了一个干净的架构和无控件都可以使用,但他们需要比骨干多一点学习。

这些框架提供的遗传结构,感觉很像常见的基于类的一个(认为Java)。 这是因为他们在内部创建的特殊对象,仅仅作为prototype S代表他人,因而采取类的角色。

例如,当你调用Ext.define('MyClass', {extend: 'ParentClass', mixins: foo, ... })然后分机创建了一个functionMyClass ”,以及一个匿名对象( MyClass.prototype )的拥有您所提供的方法。



Answer 4:

如果你的目标是支持ES5浏览器或环境中,那么你可以这样做:

var Person = {
  foo: ...,
  bar: ...
};

var Mike = Object.create(Person, { baz: ... });


文章来源: What is the correct way to create a Javascript class?