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.
ruf*_*fin 28
你知道,我认为你是对的.你的问题困扰着我,我报名参加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构造函数旁边的某个地方真是个坏消息,因为你的代码会转到意大利面." 有些人Person有sayGoodbye(),有些不做,这取决于我们是否在建造时修改了原型. "这太糟糕了.所以这种替代惯例有其优点.
当然,你仍然可以在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. 如果他没有,我可能会在这里添加他的东西和社区维基.
(通常构造函数不返回值,但如果他们想要覆盖正常的对象创建过程,他们可以选择这样做.)
| 归档时间: |
|
| 查看次数: |
15284 次 |
| 最近记录: |