JavaScript中的原型

Dan*_*Dan 5 javascript oop

在JavaScript中你可以用许多不同的方式做同样的事情.

考虑一下例子:

1:

function Circle(radius) {
 return {
  "r" : radius,
  "area" : function(){
   return Circle.pi * this.r * this.r; 
  }
 }
}
Circle.pi = 3.14159;

var a = Circle(10);
alert(a.area());
Run Code Online (Sandbox Code Playgroud)

2:

function Circle(radius) {
    this.r = radius;
}

Circle.pi = 3.14159;
Circle.prototype.area = function(){
 return Circle.pi * this.r * this.r; 
}

var a = new Circle(10);
alert(a.area());
Run Code Online (Sandbox Code Playgroud)

第二个比第一个好,因为我们没有为Circle的任何实例定义相同的功能区域.

但让我们考虑3:

function Circle(radius) {
 return {
  "r" : radius,
  "area" : Circle.area
 }
}
Circle.pi = 3.14159;
Circle.area = function(){
 return Circle.pi * this.r * this.r; 
}

var a = Circle(10);
alert(a.area());
Run Code Online (Sandbox Code Playgroud)

有没有理由更喜欢第二种风格而不是第三种?或者我误解了一些东西?

cas*_*nca 4

我肯定会选择示例 2。示例 1 或示例 3 都没有充分利用 JavaScript 的面向对象功能,因为:

  1. 您在每个实例中复制方法定义。
  2. 通过返回一个新对象而不是使用this,您将丢失该类的标识,即您不能再进行类似的检查a instanceof Circle
  3. 因为您不使用原型,所以您放弃了继承的可能性。