Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.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 - Fatal编程技术网

Javascript 您使用什么样式来创建“文件”;“类”;?

Javascript 您使用什么样式来创建“文件”;“类”;?,javascript,Javascript,有几种方法可以在javascript中获得类行为,最常见的方法似乎是基于原型的,如下所示: function Vector(x, y, x) { this.x = x; this.y = y; this.z = z; return this; } Vector.prototype.length = function () { return Math.sqrt(this.x * this.x ... ); } 和基于闭包的方法类似于 function Vecto

有几种方法可以在javascript中获得类行为,最常见的方法似乎是基于原型的,如下所示:

function Vector(x, y, x) {
    this.x = x;
    this.y = y;
    this.z = z;
    return this;
}

Vector.prototype.length = function () { return Math.sqrt(this.x * this.x ... ); }
和基于闭包的方法类似于

function Vector(x, y, z) {
    this.length = function() { return Math.sqrt(x * x + ...); }
}

出于各种原因,后者的速度更快,但我看过(我经常写)原型版本,并对其他人的做法感到好奇。

嗯,我对这一点没有什么专业意见。
我通常使用基于闭包的方法,只是因为它使代码对manager更简单。但是,我发现自己使用的原型方法具有大量代码行。

您还可以选择:

function Vector(x, y, z) {
  function length() {
    return Math.sqrt(x * x + ...);
  }
}

这可能与示例2一样慢,但它看起来更像Java/C,而且更显式。

将函数分配给原型更好(对于公共方法),因为类的所有实例都将共享该方法的相同副本。如果像第二个示例中那样在构造函数内部分配函数,则每次创建新实例时,构造函数都会创建长度函数的新副本,并将其仅分配给该实例

但是,如果希望每个副本都有自己的副本,则后一种技术非常有用,其主要用途是执行私有/特权方法,这些方法可以访问构造函数中声明的私有变量,并通过闭包机制继承

道格拉斯·克罗克福德(Douglas Crockford)有一个很好的包装器。

幸运的是,我开始使用它,它提供了一些很好的包装器。所以你可以这样做:

var Person = Class.create({
    initialize: function(name) {
        this.name = name;
    },
    say: function(message) {
        return this.name + ': ' + message;
    }
});

原型还有对象文字方法:

var Vector = function(){};

Vector.prototype = {
  init:function(x,y,z) {
    this.x = x;
    this.y = y;
    this.z = z;
  },
  length:function() {
    return Math.sqrt(x * x + ...);
  }
};

var v1 = new Vector();
v1.init(1,2,3);

我非常喜欢用这个。轻量级的、直接的,如果您熟悉“常用的”面向对象风格,您已经知道如何使用它。

javascript中没有类

然而,也有一些对象。在javascript中创建对象不需要类。它确实具有可以使用new调用的构造函数,例如:

var james = new Person();
您可以通过以下方式模拟类行为:

原型示例:

function Car (type) {
    this.type = type;
    this.color = "red";
}

Car.prototype.getInfo = function() {
    return this.color + ' ' + this.type + ' car';
};
对象文字示例

var car = {
    type: "honda",
    color: "red",
    getInfo: function () {
        return this.color + ' ' + this.type + ' car';
    }
}

我的测试表明,基于闭包的方法速度较慢。您必须为每个对象实例化一个单独的闭包。prototype方法与所有实例共享这些方法。如果从其他对象继承,则无法设置文字原型对象,这将覆盖以前的prototype您是正确的-但在本例中,“Vector”是一个新对象,所以我认为没有必要担心继承问题。我不认为OP要求的是一个隐藏细节的包装器。他想知道你为什么会选择这两种方法中的一种,这样他就可以权衡利弊了