我遇到了另一个开发人员的代码,它做了这样的事情来定义一个 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 失误或“陷阱”,应该被视为一个错误。
请注意,我的Ninja
示例基于 John Resig 的教程中的一些示例代码。有问题的实际类型不称为Ninja
,并且更长更复杂。
此外,我已经阅读了构造函数和原型指南并理解了,例如原型如何在属性查找中使用以及为什么 isinstanceof
仍然有效。