我遇到过另一个开发人员的代码,它执行类似的操作来定义 Javascript 类型:
function Ninja() {}
Ninja.prototype = {
swingSword: function(){
return true;
}
}
当更传统的方式是这样的:
function Ninja() {}
Ninja.prototype.swingSword = function() {
return true;
}
第一种形式主要有效,因为您可以创建一个新实例并调用swingSword
方法,以及instanceof
是准确的:
var ninja = new Ninja();
ninja.swingSword(); // returns true
ninja instanceof Ninja; // also true
然而,ninja.constructor
指着Object
而不是Ninja
功能。这对我来说是一个问题:我试图通过实例访问构造函数,作为构造函数不以任何其他方式公开的解决方法。但除了访问constructor
反射/解决方法黑客的属性,第一种形式是否会导致任何重大问题?
原版还有其他重要属性吗?Ninja.prototype
哪个可能被隐藏?第一种形式会导致继承类型或公共库出现任何问题吗?
我试图弄清楚这是否是一个不寻常但可以接受的 Javascript 模式,或者实际上是一个常见的 Javascript 失误或“陷阱”,应该被视为一个错误。
Note my Ninja
示例基于一些示例代码 http://ejohn.org/apps/learn/#65来自 John Resig 的教程。有问题的实际类型没有被调用Ninja
,并且更长且更复杂。
另外,我读过this http://zeekat.nl/articles/constructors-considered-mildly-confusing.html#sec-8-1构造函数和原型指南并理解,例如如何在属性查找和why isinstanceof
仍然有效。