是否可以分配JavaScript原型对象而不仅仅是其属性?

mae*_*ics 30 javascript prototype-programming

在JavaScript中,我们可以为函数的原型分配属性或直接设置其原型对象:

var MyClass = function() { };

// The "property" form...
MyClass.prototype.foo = function() { ... };
MyClass.prototype.bar = function() { ... };
MyClass.prototype.gah = function() { ... };

// OR the "assignment" form...
MyClass.prototype = {
  foo:function() { ... },
  bar:function() { ... },
  gah:function() { ... }
};
Run Code Online (Sandbox Code Playgroud)

我个人更喜欢分配表单,因为您可以轻松地将对象包装在一个闭包中(例如隐藏"私有"对象),如果您以后决定更改"MyClass"的名称,您只需找到两个点而不是潜在的许多.(当然,对于"属性"形式也可以这样说,通过使用和调用一个以现有原型作为参数的函数,但在我看来,"赋值"形式似乎更直接.)

是否有充分的理由使用一种形式而不是另一种形式?

[编辑]

正如评论者@Raynos所提到的,第二种形式(赋值)破坏了prototype.constructor属性,该属性应该设置为MyClass函数(默认情况下是第一种形式[property]).这有什么真正的缺点(除了未设置属性的事实)?

g.d*_*d.c 22

不使用第二种形式的最大原因是,在分配原型之前,最终会消除原型中存在的任何其他内容.如果那不是你所关心的事情,就没有理由不以你所展示的方式宣布它.

  • 特别是`.prototype.constructor`属性应该是`MyClass` (8认同)
  • @Raynos:感谢输入 - 忘记将`prototype.constructor`分配给MyClass函数有什么缺点? (3认同)
  • 您可以通过在新属性对象中添加`constructor:MyClass`或更常见的`constructor:Myclass.prototype.constructor`来保留构造函数. (2认同)

Gle*_*mad 6

我认为对财产使用“转让”形式还有另一个缺点prototype:您可能会消灭掉prototype.__proto__:当您处理“伪经典”继承时,

当然,有人可能会说有一种可疑的方法可以解决这个问题,那就是__proto__自己附加财产以再次连接链条。但是如果您调用父方法,忘记这样做将会破坏代码。在这里查看我的小提琴: http: //jsfiddle.net/glenn/v5Yub/

结论:“转让”形式可能看起来更简单/更干净,但“财产”形式更安全。