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


任何人都可以请告诉我,在Javascript中的区别

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

MyClass.prototype = Object;

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


7391
2017-09-14 06:23


起源

可能重复 在这里使用'new'关键字的原因是什么? - Bergi
@Bergi这个问题已经超过4年了。你联系到的那个是2岁...... - moxn
1.5岁的答案仍然有效,仍然可以通过搜索和链接找到这个问题。它应该指向其他有用的答案...... - Bergi
可能重复 new MyObject(); vs new MyObject; - Ciro Santilli 新疆改造中心 六四事件 法轮功


答案:


您的前两个示例完全相同:

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

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

我个人更喜欢第二个,对象 文字 要么 初始化器 句法:

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

编辑: 响应您的评论,空对象文字 { } 基本相当于 new Object() 因为这个:

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

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

有关更多详细信息,请查看的11.1.5部分(对象初始化程序) ECMAScript语言规范 (PDF)。

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

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

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

11
2017-09-14 06:35



嗯,所以如果两个例子都不会产生任何类型的错误并且基本上做同样的事情(实际上是这样),那么浏览器的javascript引擎的松弛只允许第二个例子工作吗? - moxn
不,我知道{} == new Object()。我所说的“第二个例子”是...... prototype = Object; - moxn
好的,我明白了。谢谢你的解释。 - moxn
你很受欢迎@moxn - CMS


这取决于 Object。如果它是你想要使用的功能 new Object() 方法。如果它是“虚拟类”(使用定义 Object = {someProperty: someValue})然后你使用第二种方法。

更多指针 这一页 在JavaScript中的原型继承


2
2017-09-14 06:32



很棒的链接,谢谢 - moxn


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

以上更正:应该是

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

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

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

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

0
2017-08-10 15:29