Difference between MyClass.prototype = new Object() and MyClass.prototype = Object

后端 未结 3 701
醉酒成梦
醉酒成梦 2021-02-05 21:51

could anyone please tell me, where in Javascript the difference between

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

and

MyC         


        
相关标签:
3条回答
  • 2021-02-05 22:33

    It depends on Object. If it is a function you want to use the new Object() method. If it is a "virtual class" (defined using Object = {someProperty: someValue}) then you use the second method.

    Some more pointers in this page on prototype inheritance in JavaScript

    0 讨论(0)
  • 2021-02-05 22:39

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

    Correction to the above: it should be

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

    (Note the equals sign after 'method1').

    The colon is used only when the method definition is itself within an object definition, like:

    var myObject = {myVar1: 10, myMethod1: function() { /* */};
    
    0 讨论(0)
  • 2021-02-05 22:52

    Your first two examples are completely equivalent:

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

    Your third example is not valid, since you are assigning to the MyClass.prototype a reference to the Object constructor, and it's a function, not a new object.

    I personally prefer the second, the object literal or initialiser syntax:

    MyClass.prototype = {prop1: 'value', prop2: 'value2'};
    //...
    MyClass.prototype.foo = 'bar';
    MyClass.prototype.method1: function () {/**/};
    

    Edit: In response to your comment, an empty object literal { } essentially equivalent to new Object() because of this:

    The production ObjectLiteral : { } is evaluated as follows:

    1. Create a new object as if by the expression new Object().
    2. Return Result(1).

    For more details check the 11.1.5 section (Object Initialiser) of the ECMAScript Language Spec (pdf).

    Edit: The third example won't produce any errors, but is not good at all, for example you can easily clobber the Object constructor function if you extend afterward the MyClass.prototype:

    MyClass.prototype = Object;
    MyClass.prototype.foo = 'bar';
    
    Object.foo === MyClass.prototype.foo; // true
    
    0 讨论(0)
提交回复
热议问题