@@ -27,25 +27,29 @@ JavaScript 中的构造函数和其它语言中的构造函数是不同的。
2727 }
2828 new Bar(); // 返回新创建的对象
2929
30- // 译者注:new Bar() 返回的是新创建的对象,而不是数字的字面值 2。
31- // 因此 new Bar().constructor === Bar
32- // 但是如果返回的是数字对象,结果就不同了
33- // function Bar() {
34- // return new Number(2);
35- // }
36- // new Bar().constructor === Number
37-
38-
39- function Test() {
30+ function Test() {
4031 this.value = 2;
4132
4233 return {
4334 foo: 1
4435 };
4536 }
4637 new Test(); // 返回的对象
47- // 译者注:这里得到的是函数返回的对象,而不是通过 new 关键字新创建的对象
48- // 所有 (new Test()).value 为 undefined,但是 (new Test()).foo === 1。
38+
39+
40+ [ 译者注] [ 30 ] :new Bar() 返回的是新创建的对象,而不是数字的字面值 2。
41+ 因此 new Bar().constructor === Bar,但是如果返回的是数字对象,结果就不同了,如下所示
42+
43+ function Bar() {
44+ return new Number(2);
45+ }
46+ new Bar().constructor === Number
47+
48+
49+ [ 译者注] [ 30 ] :这里得到的(new Test())是函数返回的对象,而不是通过 new 关键字新创建的对象,因此:
50+ (new Test()).value === undefined
51+ (new Test()).foo === 1
52+
4953
5054如果 ` new ` 被遗漏了,则函数** 不会** 返回新创建的对象。
5155
@@ -80,12 +84,13 @@ JavaScript 中的构造函数和其它语言中的构造函数是不同的。
8084其实这里创建了一个[ 闭包] ( #function.closures ) 。
8185
8286
83- 还需要注意,` new Bar() ` 并** 不会** 改变返回对象的原型(译者注:也就是返回对象的原型不会指向 Bar.prototype)。
84- 因为构造函数的原型会被指向到刚刚创建的新对象,而这里的 ` Bar ` 没有把这个新对象返回(译者注:而是返回了一个包含 ` method ` 属性的自定义对象)。
87+ 还需要注意,` new Bar() ` 并** 不会** 改变返回对象的原型([ 译者注] [ 30 ] :也就是返回对象的原型不会指向 Bar.prototype)。
88+ 因为构造函数的原型会被指向到刚刚创建的新对象,而这里的 ` Bar ` 没有把这个新对象返回([ 译者注] [ 30 ] :而是返回了一个包含 ` method ` 属性的自定义对象)。
8589
8690在上面的例子中,使用或者不使用 ` new ` 关键字没有功能性的区别。
8791
88- // 译者注:上面两种方式创建的对象不能访问 Bar 原型链上的属性
92+ [ 译者注] [ 30 ] :上面两种方式创建的对象不能访问 Bar 原型链上的属性,如下所示:
93+
8994 var bar1 = new Bar();
9095 typeof(bar1.method); // "function"
9196 typeof(bar1.foo); // "undefined"
@@ -129,3 +134,5 @@ JavaScript 中的构造函数和其它语言中的构造函数是不同的。
129134虽然遗漏 ` new ` 关键字可能会导致问题,但这并** 不是** 放弃使用原型链的借口。
130135最终使用哪种方式取决于应用程序的需求,选择一种代码书写风格并** 坚持** 下去才是最重要的。
131136
137+
138+ [ 30 ] : http://cnblogs.com/sanshi/
0 commit comments