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

oll*_*iej 19 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 ... ); }
Run Code Online (Sandbox Code Playgroud)

和基于闭包的方法类似于

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

由于各种原因,后者更快,但我已经看到(我经常写)原型版本,并对其他人做了什么感到好奇.

Kie*_*ron 10

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

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

Douglas Crockford有一个很好的总结.


Jay*_*Tee 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);
Run Code Online (Sandbox Code Playgroud)