有没有人能告诉我,在Javascript中以下两种写法的区别?
MyClass.prototype = new Object(); //or ... = {}
和
MyClass.prototype = Object;
有差异吗?如果结果没有差异,使用哪种方式是最佳实践?
有没有人能告诉我,在Javascript中以下两种写法的区别?
MyClass.prototype = new Object(); //or ... = {}
和
MyClass.prototype = Object;
有差异吗?如果结果没有差异,使用哪种方式是最佳实践?
你的前两个例子完全等同:
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:{ }的步骤如下:
- 创建一个新对象,就好像通过表达式new Object()。
- 返回结果(1)。
有关详细信息,请查看ECMAScript语言规范 (pdf)中的第11.1.5节(对象初始化器)。
编辑: 第三个示例不会产生任何错误,但实际上并不好,例如,如果在MyClass.prototype之后扩展,则很容易破坏Object构造函数。
MyClass.prototype = Object;
MyClass.prototype.foo = 'bar';
Object.foo === MyClass.prototype.foo; // true
这取决于Object
。如果它是一个函数,您需要使用new Object()
方法。如果它是一个“虚拟类”(使用Object = {someProperty: someValue}
定义),则使用第二种方法。
在这个页面上还有更多关于JavaScript原型继承的指针。
MyClass.prototype.method1 = function () {/**/};
var myObject = {myVar1: 10, myMethod1: function() { /* */};