MyClass.prototype = new Object()和MyClass.prototype = Object之间的区别

时间:2009-09-14 06:23:43

标签: javascript inheritance

可以有人请告诉我,在Javascript中的区别

MyClass.prototype = new Object(); //or ... = {}

MyClass.prototype = Object;

是?如果结果没有差异,哪一个是最佳实践方式?

3 个答案:

答案 0 :(得分:11)

前两个示例完全等效:

MyClass.prototype = new Object(); // empty object
MyClass.prototype = {}; // empty object

您的第三个示例无效,因为您要为MyClass.prototype Object构造函数分配MyClass.prototype = {prop1: 'value', prop2: 'value2'}; //... MyClass.prototype.foo = 'bar'; MyClass.prototype.method1: function () {/**/}; ,它是一个函数,而不是一个新对象。

我个人更喜欢第二种,对象literalinitialiser语法:

{ }

修改:在回复您的评论时,由于以下原因,空对象文字new Object()基本上等同于MyClass.prototype = Object; MyClass.prototype.foo = 'bar'; Object.foo === MyClass.prototype.foo; // true

  

生产ObjectLiteral:{}是   评估如下:

     
      
  1. 创建一个新对象,就像使用表达式new Object()。
  2. 一样   
  3. 返回结果(1)。
  4.   

有关详细信息,请查看ECMAScript Language Spec(pdf)的11.1.5部分(对象初始化)。

编辑:第三个示例不会产生任何错误,但是根本不好,例如,如果你之后扩展MyClass.prototype,你可以轻松地破坏Object构造函数:

{{1}}

答案 1 :(得分:2)

取决于Object。如果它是一个函数,您想使用new Object()方法。如果它是“虚拟类”(使用Object = {someProperty: someValue}定义),那么您使用第二种方法。

this page中有关JavaScript中原型继承的更多指示

答案 2 :(得分:0)

  

MyClass.prototype.method1:function()   {/ ** /};

对上述的更正:它应该是

MyClass.prototype.method1 = function () {/**/}; 

(注意'method1'后面的等号)。

冒号仅在方法定义本身位于对象定义中时使用,如:

var myObject = {myVar1: 10, myMethod1: function() { /* */};