Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建Javascript类的正确方法是什么?_Javascript_Oop_Object - Fatal编程技术网

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

创建Javascript类的正确方法是什么?,javascript,oop,object,Javascript,Oop,Object,我试图弄清楚如何正确构造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() {

我试图弄清楚如何正确构造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() { ... }
}
我希望能够设置一些属性并分配可用的方法。我还希望能够在对象上使用类似的东西,以便可以使用类似的东西扩展这些对象

我试图弄清楚如何正确构造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() { ... }
}
这些(“类”和单例对象)之间有很大的区别。前两个示例是一次性对象(单例)。您的第三个(最后一个)示例创建了一个构造函数,该构造函数允许您创建共享同一原型的多个对象。我建议在构造函数函数中增加
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);
};
…这就是为什么你经常看到库介入,比如Prototype的
之类的东西,或者我自己的;但是,根据ES2015语法,这些已经过时,这使得它变得非常简单:

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的一大优点是,您可以选择自己的“类”样式。

您还可以使用以下内容:

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

var o=new O(0,0);

如果您的目标浏览器或环境支持ES5,则可以执行以下操作:

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

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

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

  • 拥有您所需要的一切,包括mixin和事件系统
如果你也需要一些小部件,考虑一下

它们都提供了一个干净的体系结构,可以在没有小部件的情况下使用,但它们需要比主干网更多的学习

这些框架提供的继承结构感觉非常像基于公共类的继承结构(想想Java)。这是因为它们在内部创建了特殊的对象,而这些对象只充当其他对象的
原型,因此充当类的角色


例如,当您调用
Ext.define('MyClass',{extend:'ParentClass',mixins:foo,…})
时,Ext会创建一个
函数
MyClass
”,以及一个匿名对象(
MyClass.prototype
),其中包含您提供的方法。

规则#1:永远不要使用
新对象()
@minitech,您确定吗?他们一定是出于某种原因才这样做的。@Xeoncross他们也制作了
新窗口
,但您不能使用它;)新的阵列,新的号码,新的。。。最好使用literalsn将字符串文本传递给
新字符串
构造函数不是很讽刺吗?