【发布时间】: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