【问题标题】:Using `this` vs Object.create(prototype)使用 `this` 与 Object.create(prototype)
【发布时间】:2016-01-08 15:41:40
【问题描述】:

我一直在使用 JSLint 来帮助我重新学习如何正确编码。该程序不喜欢在我的代码中使用this,所以我决定使用self=Object.create(MyType.prototype)。使用此模式是否有任何陷阱或限制?避免this 是不是我太冗长了?以下是我如何使用原型继承编写构造函数的示例:

function MyType(args) {
    var privateVar1 = "value",
        self = Object.create(MyType.prototype);

    function privateFunction() { )

    self.publicMethod1 = function(aa) {
        // do stuff with private vars & self. Ex:
        var methodVar = privateVar1 + aa;
        self.publicProperty = args;
        privateFunction();
        return methodVar;
    };

    return self;
}
MyType.prototype = {
    publicProperty: "initial value",
    publicMethod2: function (aa) { }
}

function MyType2(args) {
    var self = Object.create(MyType2.prototype);
    return self;
}
MyType2.prototype = Object.create(MyType.prototype);
MyType2.prototype.publicMethod3 = function (aa) { };

在长时间的停工之后,我再次自学了 JavaScript。从我做任何事情到现在已经有十年了。互联网永远不会真正忘记,但进步仍在发生。所以一些教程似乎是基于旧的标准/建议,而新的文章与它们相矛盾。区分哪些文章是最新的,哪些是过时的变得令人困惑。请给我一些帮助。

【问题讨论】:

  • 为了减少对代码的偏见反馈,请改用jshint.com。在很多地方使用this 没有错。您没有展示 jslint 反对的具体内容,因此我们无法对此发表评论。
  • 很遗憾,您错过了 ECMAScript 没有变化和 DOM API 变化缓慢的 10 年。两者现在都非常动态,打算每年发布一个新版本的 ECMAScript(因此版本现在以发布年份命名,从 ECMAScript 2015 开始,又名 ECMAScript ed 6)。 ECMAScript 从 ed 3 到当前版本已经发生了巨大的变化,并且至少在接下来的几年中将继续发生相当大的变化。较旧的教程不会有错,但可能无法代表您使用现代语言功能所能做到的最佳效果。
  • 您的模式没有问题,但我认为在已有实例的情况下创建一个新实例并不是一个好主意。我会tell JSLint to shut up,如果你想安全,请检查this instanceof MyType
  • Oriol,谢谢您,先生。你能解释一下为什么你认为这是一个坏主意吗? AFAIU,当使用new 调用函数Fn 时,this 将与Object.create(Fn.prototype); 具有相同的值。但是,如果在没有new 的情况下调用 Fn,那么这是未定义的或全局对象(或其他对象?)。通过显式调用Object.create(Fn.prototype); 并返回对象,我希望该函数将始终按预期返回一个新对象。我的推理正确吗?为什么你认为这是一个坏主意?
  • jfriend00,RobG,也谢谢你。感谢您对 jshint 的提醒。我担心使用这个错误,但它确实使代码在某些情况下更容易理解。我刚刚读到它还可以帮助脚本在创建许多对象时使用更少的内存(并且使用this 代替self 将函数移动到原型)。 RobG,这很有趣!我有很多事情要做。

标签: javascript object prototype this


【解决方案1】:

JSLint 工具仅告诉您 Douglas Crockford 希望您如何使用 JavaScript。 JSLint 这个名字相当具有误导性,因为它不根据语言标准验证代码,而是根据 Douglas Crockfords 关于如何使用该语言的观点来验证代码。如果你想不折不扣地听从他的建议,那你就做对了。

其他教程不一定过时或错误,它们大多只是不同。使用 JavaScript 的方式有很多种,不止一种。

就个人而言,我会写:

function MyType(args) {
  var privateVar1 = "value";

  function privateFunction() { )

  this.publicMethod1 = function(aa) {
    // do stuff with private vars & this. Ex:
    var methodVar = privateVar1 + aa;
    this.publicProperty = args;
    privateFunction();
    return methodVar;
  };
}

MyType.prototype = {
  publicProperty: "initial value",
  publicMethod2: function (aa) { }
}

function MyType2(args) {
}
MyType2.prototype = Object.create(MyType.prototype);
MyType2.prototype.publicMethod3 = function (aa) { };

【讨论】:

  • 感谢您,不仅是您的建议,而且还展示了您将如何做到这一点。我很感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-29
  • 1970-01-01
  • 1970-01-01
  • 2020-04-16
  • 1970-01-01
  • 2016-12-04
  • 2018-12-11
相关资源
最近更新 更多