function MyClass(){...}; MyClass.prototype = MyClass; - 被认为有害吗?

时间:2010-11-14 17:06:59

标签: javascript prototype

显然,用JavaScript实现基于类的实例方法是一种习惯用法:

function MyClass(){...}
MyClass.prototype.methodA = function(){...}
MyClass.prototype.methodB = function(){...}
...

为什么人们不会使用这种不那么冗长的形式:

function MyClass(){...}
MyClass.prototype = MyClass;
MyClass.methodA = function(){...}
MyClass.methodB = function(){...}

如果MyClass应该从某个基类继承,那么它显然不起作用(在这种情况下,通常应该将原型设置为基类的新实例)。

然而,这些天深层次的继承层次变得越来越少(感谢鸭子打字和混合等等)。

我错过了什么吗?

MyClass.prototype = MyClass使得.constuctor比现在更糟糕了吗?

它是否会干扰typeof,instanceof甚至getPrototypeOf()的错误方式?

它应该被宣传还是被认为有害?

2 个答案:

答案 0 :(得分:2)

也许是因为形式更简洁?

MyClass.prototype = {
    methodA: function(){},
    methodB: function(){}
};

你获得的方法越多越清洁,除此之外,你只是重写默认原型及其上的内容。

答案 1 :(得分:1)

我认为这是没有意义的,如果您的某个方法的名称模糊了Function.prototype中的本机方法,它会让您陷入潜在的麻烦。

您始终可以像这样初始化原型:

function MyConstructor() { ... }

MyConstructor.prototype = {
  myMethod: function() { ... },
  whatever: null
};

编辑 - 如果你不喜欢创建对象常量(我不得不说如果你要在Javascript中编码很多,我建议你试着习惯他们),你可以这样做:

MyConstructor.prototype = {};
MyConstructor.prototype.myMethod = function() { ... };

我个人不喜欢打那么多打字。