如何避免在Javascript原型中使用"this"

use*_*742 16 javascript this prototypal-inheritance

这是我的javascript对象,我想知道如何避免在原型中多次使用"this".我知道有许多理论和原型关系的联系,这可能已经得到了解答,但由于我无法满足所有目的,我认为这可能值得另一个问题.

function shape(smth) {
    this.a = smth
    this.b = 2
    this.c = 3
}

shape.prototype.doCalculus = function () {
    return this.a * this.b + this.c - (2 * (this.b + this.c) + this.a);
}

module.exports = shape
Run Code Online (Sandbox Code Playgroud)

jfr*_*d00 9

如果你想要一个对象的公共成员,它们必须从this指针引用.这就是OO在Javascript中的工作方式.别无选择.

如果你在函数中有很多对同一变量的引用,你可以暂时将它放在一个局部变量中,只是为了保存一些引用逻辑(与任何多步引用相同),但你仍然需要最初检索使用this.varName.


有一个方案在构造函数闭包中使用"私有"成员变量,并且不使用可以在某些情况下使用的原型,这允许您直接引用变量而不使用以下内容this:

function shape(smth) {
    var a = smth,
        b = 2,
        c = 3;

    this.doCalculus = function() {
        return a * b + c - (2 * (b + c) + a);
    }
}

module.exports = shape
Run Code Online (Sandbox Code Playgroud)

对于创建大量实例的对象类型,这可能会占用更多内存,因为方法不存储在共享原型中,而是为每个实例单独创建.有人认为,在大多数用途中,记忆消耗的差异并不重要.


Dan*_*nce 5

this通过使用Object.create创建原型链,然后直接在结果对象上声明属性,可以避免在构造函数中使用.

function Shape(smth) {
  var shape = Object.create(Shape.prototype);

  shape.a = smth;
  shape.b = 2;
  shape.c = 3;

  return shape;
}
Run Code Online (Sandbox Code Playgroud)

这消除了需要this在你的Shape功能,这意味着我们不再需要调用它new要么.

new Shape(1); // { a: 1, b: 2, c: 3, __proto__: Shape.prototype }
Shape(1);     // { a: 1, b: 2, c: 3, __proto__: Shape.prototype }
Run Code Online (Sandbox Code Playgroud)

但是,您仍需要this在原型方法中使用以引用正确的实例.