Page 169 - 你不知道的JavaScript(上卷)
P. 169

还记得这张图吗,它不仅展示出对象(实例)a1 到 Foo.prototype 的委托关系,还展示出
               Bar.prototype 到 Foo.prototype 的委托关系,而后者和类继承很相似,只有箭头的方向不
               同。图中由下到上的箭头表明这是委托关联,不是复制操作。

               下面这段代码使用的就是典型的“原型风格”:

                   function Foo(name) {
                       this.name = name;
                   }

                   Foo.prototype.myName = function() {
                       return this.name;
                   };

                   function Bar(name,label) {
                       Foo.call( this, name );
                       this.label = label;
                   }

                   // 我们创建了一个新的 Bar.prototype 对象并关联到 Foo.prototype
                   Bar.prototype = Object.create( Foo.prototype );

                   // 注意!现在没有 Bar.prototype.constructor 了
                   // 如果你需要这个属性的话可能需要手动修复一下它

                   Bar.prototype.myLabel = function() {
                       return this.label;
                   };

                   var a = new Bar( "a", "obj a" );

                   a.myName(); // "a"
                   a.myLabel(); // "obj a"




                          如果不明白为什么 this 指向 a 的话,请查看第 2 章。




               这段代码的核心部分就是语句 Bar.prototype  =  Object.create(  Foo.prototype  )。调用
               Object.create(..) 会凭空创建一个“新”对象并把新对象内部的 [[Prototype]] 关联到你
               指定的对象(本例中是 Foo.prototype)。

               换句话说,这条语句的意思是:“创建一个新的 Bar.prototype 对象并把它关联到 Foo.
               prototype”。

               声明 function Bar() { .. } 时,和其他函数一样,Bar 会有一个 .prototype 关联到默认的
               对象,但是这个对象并不是我们想要的 Foo.prototype。因此我们创建了一个新对象并把



               154   |   第 5 章
   164   165   166   167   168   169   170   171   172   173   174