OOP JavaScript:在方法中使用“this”是必要的吗?

时间:2016-01-06 11:03:42

标签: javascript oop

从具有该属性的对象访问对象属性时,应使用“this”关键字。

我做了这个演示。两种方式都很好。

那么,是否有充分的理由添加“this”或者可以将其删除?

function CalcCircle(radius) {
  this.radius = radius;

  this.getCircle = function () { 
    // Accessing the property "radius" WITH "this".
    return (Math.PI * this.radius * 2); 
  };
}

// Without the "this" keyword.
function CalcCircle2(radius) {
  this.radius = radius;

  this.getCircle = function () { 
    // Accessing the property "radius" WITHOUT "this".
    return (Math.PI * radius * 2); 
  };
}

var o1 = new CalcCircle(10);
var o2 = new CalcCircle2(10);

console.log('With "this": ' + o1.getCircle());
// With "this": 62.83185307179586
console.log('Without "this": ' + o2.getCircle());
// Without "this": 62.83185307179586

4 个答案:

答案 0 :(得分:3)

不同之处在于,当您只是引用radius时,您指的是创建对象时传递的值。

如果radius的值在运行时在圈子上发生变化,则从getCircle返回的值将不会在第二个值中更新。

答案 1 :(得分:1)

您可以在第二个实现中不使用this关键字的原因是因为您的函数getCircle正在从{{1}传入的参数中访问radius }}

CalcCircle2

// Without the "this" keyword. function CalcCircle2(radius) { this.getCircle = function () { return (Math.PI * radius * 2); // ^^^^^^ // radius is searched for in this function scope... // was not found. // checks next scope chain... // radius is found! }; } 关键字的目的是将某个变量绑定到对象的实例。

在此特定实现中,您不需要来使用this关键字,但在定义属性时,最好在OOP中开始使用它。一个东西。

旁注:

使用prototypical inheritance创建对象时,this关键字变得更加有用。这是在您创建对象并为其提供可从该对象的任何实例继承的属性时。

this

在这个例子中,我们需要使用var CalcCircle = function(radius){ this.radius = radius; } CalcCircle.prototype.getCircle = function(){ return (Math.PI * this.radius * 2); // ^^^^ // Now we need this }; 来引用与我们定义的其他函数中的对象关联的变量。

答案 2 :(得分:1)

您是否在this的示例中使用CalcCircle2仅区分您实际使用的变量。使用this您可以使用该属性。没有this,你正在使用构造函数的参数(通过JS闭包)。

一般来说,最好先使用一次参数,然后依靠你创建的字段。

您可能还想通过原型检查附加方法,而不是在构造函数中创建它们,在这种情况下,您将被迫使用该字段:

function CalcCircle2(radius) {
    this.radius = radius;
}

CalcCircle2.prototype.getCircle = function () { 
    // Accessing the property "radius" WITHOUT "this".
    return (Math.PI * this.radius * 2); 
};
var o2 = new CalcCircle2(10);
o2.getCircle();

答案 3 :(得分:0)

两种无线电都不同

在使用this.radius

的函数中
function CalcCircle(radius) {
  this.radius = radius;

  this.getCircle = function () { 
    // Accessing the property "radius" WITH "this".
    return (Math.PI * this.radius * 2); 
  };
}

您正在访问Object的属性。

而在第二个功能

function CalcCircle2(radius) {
  this.radius = radius;

  this.getCircle = function () { 
    // Accessing the property "radius" WITHOUT "this".
    return (Math.PI * radius * 2); 
  };
}

当你使用CalcCircle2函数的参数时。