你用什么样的风格来创建“课堂”?

时间:2008-08-09 00:56:15

标签: 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 Vector(x, y, z) {
    this.length = function() { return Math.sqrt(x * x + ...); }
}

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

7 个答案:

答案 0 :(得分:9)

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

然而,如果希望每个副本拥有它自己的副本,后一种技术很有用,主要用于执行私有/特权方法,这些方法可以访问构造函数内部声明的私有变量,通过闭包机制继承。

道格拉斯·克罗克福德有一个很好的summary

答案 1 :(得分:4)

还有原型的对象文字方法:

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);

答案 2 :(得分:3)

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

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

Prototype.js Documentation: Defining classes and inheritance

答案 3 :(得分:2)

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

答案 4 :(得分:2)

您还可以选择:

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

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

答案 5 :(得分:1)

我非常喜欢使用John Resig's library。轻巧,直接,如果您熟悉“通常的”面向对象风格,您已经知道如何使用它。

答案 6 :(得分: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';
    }
}