JavaScript语言精粹中的坑

2017-12-20更新:

  • 更新了以往表达不清楚的部分,为三个版本不同的地方添加上了注
  • 附上了图书版次信息以供查询

Javascript语言精粹

第3章 对象

原型

if  (typeof Object.beget !== 'function'){ // 注意这里检查是否存在beget函数
    Object.create = function(o) { // 而这里则是给Object添加了create方法
        var F = function () {};
        F.prototype = o;
        return new F();
    }
}

这个函数旨在为Object增加一个create方法,这个方法创建一个使用原对象作为其原型的新对象。
我不明白的是为什么检查beget是否是一个函数(即是否已经存在),而下面则没有用到beget函数(而是在Object上面添加了create方法?)

直接上结论:

这应该是一个印刷错误

这块应该是有两个版本:

  • 这个是英文原版
if( typeof Object.beget !== 'function' ){ // 注意这里是检查beget是否存在
    Object.beget = function(o){ // 而这里同样是添加beget方法
          var F =new Function(){}; 
          F.prototype = o;
          return new F();
    }
}
  • 这个是Safari Books Online上面的版本
if (typeof Object.create !== 'function') { // 注意这里检查create方法是否存在
    Object.create = function (o) { // 而这里是添加的create方法
        var F = function () {};
        F.prototype = o;
        return new F();
    };
}

注意:在此书新版本中,不推荐使用new关键词,而是选择使用函数表达式的方法声明函数。

这里附上图书版次信息,以供遇到同样的朋友参考

Javacript语言精粹(Crockford,D.)
电子工业出版社 2012.9
ISBN: 978-7-121-17740-8
印次:2017.04 第13次印刷


感谢Brian Duncan回答了这部分关于new的相关问题。

另外,在javascript中,new关键字必须与函数一同工作。

例如

    var a = new Array();

这里a是一个数组,typeof a == 'Object',而typeof Array == 'function';

你可能感兴趣的:(JavaScript语言精粹中的坑)