So in other words, JSLint doesn't automatically expect me to use a constructor pattern?
你知道,我认为你是对的。你的问题困扰着我,我注册了Crockford's JSLint discussion group 和asked。他回答了,但忽略了我将在下面介绍的解决方案,我认为这意味着没关系,就像 JSLint 不会抱怨通过集合时一样。
(不过,我仍在等待更新的Good Parts。)
除此之外,我建议对通过 Beta JSLint 的 OO JavaScript 执行以下操作(无论如何,从今天开始)。
我将重写 MDN 页面“Introduction to Object Oriented Programming”中的一个示例,该页面本身大量使用this。
与this
这是上面链接部分中原始的、unlinted 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"
这遵循我们熟悉和喜爱的惯例。
没有this
很容易弄清楚如何制作不遵循该模式的“构造函数”,但如果我没有遗漏任何内容,我们将不再使用prototype,并且必须将所有对象的方法包含在我们希望所有我们的Peeps 共享的构造函数。
/*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();
所以有一个 lintable 替代方案。除了return peep; 和方法的内部定义之外,这确实使 JavaScript 的行为类似于您可能遇到的许多面向对象优先的语言。至少没有错。
无法访问prototype 并不可怕;在构造函数旁边不正确的地方更改prototype 确实是个坏消息,因为您的代码会变成意大利面条。 “有些Persons 有sayGoodbye(),有些没有,这取决于我们是否在构造它们时修改了原型。” 这太糟糕了。因此,这种替代约定有其优势。
当然,稍后您仍然可以将函数添加到 Peep 的单个实例化中,但我不确定您如何在不使用 this 的情况下访问 firstName,所以也许他希望我们停止修改构建后的对象。
person1.sayGoodbye = function (other) {
console.log("Goodbye, " + other + ".");
};
(我的意思是,我们仍然可以给 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.
编辑: 另请参阅this answer,提问者后来发现 Crockford 建议的创建 OO javascript 的方法。我试图说服那个人删除 Q&A 并将 A 移到这里。如果他没有,我可能会在此处添加他的资料和社区 wiki。
编辑:请参阅 this from MDN 了解其工作原理:
(通常构造函数不返回值,但他们可以选择这样做
所以如果他们想覆盖正常的对象创建过程。)