MyClass.prototype = new Object() 和 MyClass.prototype = Object 有什么区别?

11

有没有人能告诉我,在Javascript中以下两种写法的区别?

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

MyClass.prototype = Object;

有差异吗?如果结果没有差异,使用哪种方式是最佳实践?


1
@Bergi 这个问题已经超过4年了。你链接的那个是2年前的... - moxn
这个1.5年前的答案仍然有效,并且通过搜索和链接仍然能找到这个问题。它应该指向其他有用的答案... - Bergi
可能是[new MyObject(); vs new MyObject;]的重复问题 (https://dev59.com/ZHA75IYBdhLWcg3w6Nr8) - Ciro Santilli OurBigBook.com
3个回答

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 () {/**/};

编辑: 回应您的评论,一个空对象字面量 { } 本质上等同于 new Object()这是因为:

生产ObjectLiteral:{ }的步骤如下:

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

有关详细信息,请查看ECMAScript语言规范 (pdf)中的第11.1.5节(对象初始化器)。

编辑: 第三个示例不会产生任何错误,但实际上并不好,例如,如果在MyClass.prototype之后扩展,则很容易破坏Object构造函数。

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

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

嗯嗯,所以如果这两个例子都没有任何错误,并且实际上执行的是相同的操作(就像事实上那样),是浏览器的JavaScript引擎的宽松性使第二个示例能够工作? - moxn
不,我知道 {} == new Object()。我所说的“第二个例子”的意思是...prototype = Object; - moxn

2

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

这个页面上还有更多关于JavaScript原型继承的指针。


0
MyClass.prototype.method1: function () {/**/};
以上内容更正为:
MyClass.prototype.method1 = function () {/**/}; 

(请注意“method1”后面的等号。)
冒号仅在方法定义本身位于对象定义内部时使用,例如:
var myObject = {myVar1: 10, myMethod1: function() { /* */};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接