1

从页面https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Details_of_the_Object_Model

当 JavaScript 看到 new 运算符时,它会创建一个新的通用对象并将这个新对象作为 this 关键字的值传递给 WorkerBee 构造函数。构造函数显式设置项目属性的值,并隐式设置内部 proto属性的值为 WorkerBee.prototype 的值。(该属性名称在前面有两个下划线字符,在末尾有两个下划线字符。) proto属性确定用于返回属性值的原型链。一旦设置了这些属性,JavaScript 就会返回新对象,并且赋值语句将变量标记设置为该对象。

所以基本上如果我们有这个功能:

function Bee(first_name, second_name){
    this.FirstName=name;
    this.SecondName=name;
}

我想知道做类似var bee1 = new Bee("qwe", "asd"); 与:

var bee1={};
bee1.__proto__=Bee.prototype;
var r=Bee.call(bee1, "qwe", "asd");
if(r!==undefined){
    bee1=r;
}
4

1 回答 1

4

一方面,var bee1 = new Bee("qwe", "asd");是跨浏览器兼容的。一些浏览器不会让你弄乱对象的__proto__字段——IE 就是其中之一。

另一方面,它的代码更少,乍一看更有意义。

此外,在第二个示例中,从第一行开始,您已经创建bee1但尚未初始化它。从第二行开始,系统会认为它是 a Bee,但它仍然不像一个那样构建。如果构造函数中或创建和构造之间的任何其他地方出现问题,您最终可能会得到一个半生不熟的Bee. 这与 相反new Bee(...),它要么给你一个正确构造的东西,Bee要么抛出一个异常。

于 2011-05-12T03:43:58.347 回答