MyClass.prototype = new Object(); //or ... = {}
和
MyClass.prototype = Object;
是?如果结果没有差异,哪一个是最佳实践方式?
答案 0 :(得分: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 () {/**/};
,它是一个函数,而不是一个新对象。
我个人更喜欢第二种,对象literal或initialiser语法:
{ }
修改:在回复您的评论时,由于以下原因,空对象文字new Object()
基本上等同于MyClass.prototype = Object;
MyClass.prototype.foo = 'bar';
Object.foo === MyClass.prototype.foo; // true
:
生产ObjectLiteral:{}是 评估如下:
- 创建一个新对象,就像使用表达式new Object()。
一样- 返回结果(1)。
醇>
有关详细信息,请查看ECMAScript Language Spec(pdf)的11.1.5部分(对象初始化)。
编辑:第三个示例不会产生任何错误,但是根本不好,例如,如果你之后扩展MyClass.prototype,你可以轻松地破坏Object构造函数:
{{1}}
答案 1 :(得分:2)
取决于Object
。如果它是一个函数,您想使用new Object()
方法。如果它是“虚拟类”(使用Object = {someProperty: someValue}
定义),那么您使用第二种方法。
this page中有关JavaScript中原型继承的更多指示
答案 2 :(得分:0)
MyClass.prototype.method1:function() {/ ** /};
对上述的更正:它应该是
MyClass.prototype.method1 = function () {/**/};
(注意'method1'后面的等号)。
冒号仅在方法定义本身位于对象定义中时使用,如:
var myObject = {myVar1: 10, myMethod1: function() { /* */};