JSLint错误:意外'这个'

jdw*_*jdw 40 javascript constructor jslint

无法理解为什么JSLint对我this在以下代码中的使用感到惊讶:

function testConstr (x) {
    'use strict';
    this.joker = "Whyyy sooo seriousss?";
    this.x = x;
}
Run Code Online (Sandbox Code Playgroud)

对于这两个属性赋值,JSLint说:意外的'this'.我如何更正我的代码?

Ori*_*iol 30

您的代码可能完全正确(也可能有问题,具体取决于您的调用方式testConstr).

我的建议是:告诉JSLint闭嘴

在此输入图像描述

或者根本不使用JSLint.

  • 我会使用`new`关键字来调用它(即将它用作对象构造函数).对不起,如果不清楚.换句话说,JSLint不会自动期望我使用构造函数模式?对像我这样的小行星没用... (3认同)

ruf*_*fin 28

换句话说,JSLint不会自动期望我使用构造函数模式?

你知道,我认为你是对的.你的问题困扰着我,我报名参加Crockford的JSLint讨论小组问道.他回答说,但忽略了我将要提出的解决方案,下面,我认为这意味着它没关系,就像JSLint如果有事情通过而不抱怨一样.

(不过我还在等待更新好的零件.)

抛开这个警告,这就是我建议为通过Beta JSLint的OO JavaScript做的事情(截至今天,无论如何).

我将从MDN的页面" 面向对象编程简介 "中重写一个例子,它本身就是this自由使用的.

this

以下是上面链接部分中原始的,无嵌入的 MDN示例:

var Person = function (firstName) {
  this.firstName = firstName;
};

Person.prototype.sayHello = function() {
  console.log("Hello, I'm " + this.firstName);
};

var person1 = new Person("Alice");
var person2 = new Person("Bob");

// call the Person sayHello method.
person1.sayHello(); // logs "Hello, I'm Alice"
person2.sayHello(); // logs "Hello, I'm Bob"
Run Code Online (Sandbox Code Playgroud)

这符合我们所熟知和喜爱的惯例.

没有 this

很容易弄清楚如何制作不遵循该模式的"构造函数",但prototype如果我没有遗漏某些东西,我们将失去使用,并且必须在我们想要的所有构造函数中包含所有对象的方法我们Peep分享的.

/*jslint white:true, devel:true */
var Peep = function(firstName) {
    "use strict";
    var peep = {};
    peep.firstName = firstName;

    peep.innerSayHello = function() {
        console.log("Hello, I'm " + peep.firstName + ".");
    };

    return peep;
};

var peep1 = new Peep("Bob");
var peep2 = new Peep("Doug");

peep1.innerSayHello();
peep2.innerSayHello();
Run Code Online (Sandbox Code Playgroud)

所以有一个可替代的选择.除了return peep;方法和内部定义之外,这样做可以使JavaScript像您可能遇到的许多OO优先语言一样.这不是,至少.

prototype无法访问并不可怕; 改变prototype构造函数旁边的某个地方真是个坏消息,因为你的代码会转到意大利面." 有些人PersonsayGoodbye(),有些不做,这取决于我们是否在建造时修改了原型. "这太糟糕了.所以这种替代惯例有其优点.

当然,你仍然可以在Peep稍后的单个实例中添加函数,但是我不确定你如何在firstName不使用的情况下访问它this,所以也许他希望我们在构造之后停止对象进行修改.

person1.sayGoodbye = function (other) { 
    console.log("Goodbye, " + other + "."); 
};
Run Code Online (Sandbox Code Playgroud)

(我的意思是,我们还可以通过猴子补丁Peep来改变它的中间过程,但那是可怕的,愚蠢的编程.通常.)

继承(没有this)

我认为继承很容易.

var PeepWithGoodbye = function (firstName) {
    "use strict";
    var peepWithGoodbye = new Peep(firstName);

    peepWithGoodbye.innerSayGoodbye = function (otherPeep) {
        if (undefined === otherPeep) {
            otherPeep = { firstName: "you" };
        }
        console.log("This is " + firstName 
            + " saying goodbye to " + otherPeep.firstName + ".");
    };

    return peepWithGoodbye;
};

var pwg1 = new PeepWithGoodbye("Fred");
pwg1.innerSayHello();           // Hello, I'm Fred.
pwg1.innerSayGoodbye(peep1);    // This is Fred saying goodbye to Bob.
pwg1.innerSayGoodbye();         // This is Fred saying goodbye to you.
Run Code Online (Sandbox Code Playgroud)

编辑:请参阅此答案,其中提问者后来发现了Crockford建议的创建OO javascript的方法.我试图说服那个人删除那个Q&A并在这里移动A. 如果他没有,我可能会在这里添加他的东西和社区维基.


编辑:从MDN看到这个为什么它的工作原理:

(通常构造函数不返回值,但如果他们想要覆盖正常的对象创建过程,他们可以选择这样做.)