24

有几种方法可以在 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 + ...); }
}

由于各种原因,后者更快,但我已经看到(并且我经常编写)原型版本并且很好奇其他人在做什么。

4

7 回答 7

12

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

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

Douglas Crockford 有一个很好的总结

于 2008-08-09T02:05:33.840 回答
5

原型还有对象字面量方法:

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);
于 2008-09-22T02:43:19.413 回答
3

幸运的是,我使用了prototype.js,它提供了一些不错的包装器。所以你可以这样做:

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

Prototype.js文档:定义类和继承

于 2008-08-09T02:09:04.673 回答
2

好吧,我对此真的没有专家意见。我通常最终使用基于闭包的方法,只是因为它使代码更易于管理。但是,我发现自己在使用具有大量代码行的方法的原型。

于 2008-08-09T01:12:26.863 回答
2

您还可以选择:

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

这可能与示例 2 一样慢,但它看起来更像 Java/C# 并且更明确一些。

于 2008-08-09T01:32:17.120 回答
1

我非常喜欢为此使用John Resig 的库。轻量级、直截了当,如果您熟悉“通常”的面向对象风格,您已经知道如何使用它。

于 2010-07-26T19:52:55.290 回答
1

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';
    }
}
于 2013-11-11T16:34:23.253 回答