我刚刚得到了道格拉斯·克罗克福德的
Javascript:The Good Parts,我很难理解他关于原型的一个例子.书中的代码如下:
if (typeof Object.create !== "function") { Object.create = function(o) { var F = function () {} F.prototype = o; return new F; }; }
我假设这段代码用于定位函数的原型.但为什么要使用这种复杂的方法呢?为什么不使用variable.prototype? Crockford是Javascript领域的领先专家,所以我确信有充分的理由使用这个模型.谁能帮助我更好地理解它?任何帮助,将不胜感激.@H_403_5@
解决方法
在ECMAScript 3中,new运算符是设置对象[[Prototype]]内部属性的唯一标准方法,在这种情况下,Crockford只是为此目的使用临时构造函数F.
该方法的o参数被设置为临时构造函数的prototype属性,并通过调用new F();它构建了一个继承自F.prototype的新空对象(有关新工作原理的详细信息,请参阅this question).@H_403_5@
例如:@H_403_5@
var a = { a: 1 }; var b = Object.create(a); // b inherits from a b.a; // 1
在上面的例子中,我们可以说b的内部[[Prototype]]属性指向a.@H_403_5@
Object.getPrototypeOf(b) === a; // true
换句话说,b继承自a.@H_403_5@
使用相同的示例,我们可以使用空构造函数,例如:@H_403_5@
function F(){} F.prototype = a; var b = new F(); // b again inherits from a (F.prototype)
还要记住,函数的prototype属性与所有对象都具有的[[Prototype]]属性不同,函数的prototype属性在使用new运算符调用时用于构建从该属性继承的新对象.@H_403_5@
此外,请注意,现在,ECMAScript 5标准正在实施,并且此垫片不符合规范100%,事实上,标准Object.create方法that cannot be emulated on ES3有一些功能.@H_403_5@
也可以看看:@H_403_5@