【问题标题】:Difference between MyClass.prototype = new Object() and MyClass.prototype = ObjectMyClass.prototype = new Object() 和 MyClass.prototype = Object 之间的区别
【发布时间】:2010-11-28 01:02:07
【问题描述】:

谁能告诉我,在 Javascript 中的区别在哪里

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

MyClass.prototype = Object;

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

【问题讨论】:

标签: javascript inheritance


【解决方案1】:

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

对上面的更正:应该是

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

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

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

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

【讨论】:

    【解决方案2】:

    你的前两个例子是完全等价的:

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

    您的第三个示例无效,因为您为 MyClass.prototype 分配了对 Object 构造函数的引用,它是一个函数,而不是一个新对象。

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

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

    编辑:作为对您的评论的回应,一个空的对象文字 { } 基本上等同于 new Object(),因为:

    产生式 ObjectLiteral : { } 是 评价如下:

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

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

    编辑:第三个例子不会产生任何错误,但一点也不好,例如,如果你在 MyClass.prototype 之后扩展,你可以很容易地破坏 Object 构造函数: p>

    MyClass.prototype = Object;
    MyClass.prototype.foo = 'bar';
    
    Object.foo === MyClass.prototype.foo; // true
    

    【讨论】:

    • Hmhm,所以如果两个示例都没有产生任何类型的错误并且本质上是相同的(实际上是这样),那么只是浏览器的 javascript 引擎的松懈允许第二个示例工作吗?
    • 不,我知道 {} == new Object()。我所说的“第二个例子”的意思是 ...prototype = Object;
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-12
      • 1970-01-01
      • 2013-01-16
      • 2023-03-11
      • 2014-02-10
      • 2011-08-12
      相关资源
      最近更新 更多