代码之家  ›  专栏  ›  技术社区  ›  moxn

myclass.prototype=new object()和myclass.prototype=object之间的差异

  •  11
  • moxn  · 技术社区  · 16 年前

    有人能告诉我,在javascript中

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

    MyClass.prototype = Object;
    

    是?如果结果没有什么不同,哪一个是最好的练习方法呢?

    3 回复  |  直到 10 年前
        1
  •  11
  •   Christian C. Salvadó    16 年前

    前两个例子完全相同:

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

    第三个示例无效,因为您要将 MyClass.prototype 参考 Object 构造函数,它是一个函数,而不是一个新对象。

    我个人更喜欢第二个,目标 literal initialiser 语法:

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

    编辑: 作为对注释的响应,空对象文本 { } 本质上等同于 new Object() 因此:

    生产对象文本:是 评估如下:

    1. 通过表达式new object()创建新对象。
    2. 返回结果(1)。

    有关更多详细信息,请查看 ECMAScript Language Spec (PDF)。

    编辑: 第三个例子不会产生任何错误,但一点也不好,例如,如果在myclass.prototype之后进行扩展,您可以很容易地删除对象构造函数函数:

    MyClass.prototype = Object;
    MyClass.prototype.foo = 'bar';
    
    Object.foo === MyClass.prototype.foo; // true
    
        2
  •  2
  •   gnarf    16 年前

    这取决于 Object .如果它是一个函数,则要使用 new Object() 方法。如果它是“虚拟类”(使用 Object = {someProperty: someValue} )然后使用第二种方法。

    还有一些指针 this page 论JavaScript中的原型继承

        3
  •  0
  •   thefourtheye    10 年前

    myclass.prototype.method1:函数() {/**/};

    对以上内容的修正:应该是

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

    (注意“method1”后面的等号)。

    仅当方法定义本身在对象定义中时才使用冒号,例如:

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