我刚拿到 Douglas Crockford 的 Javascript:The Good Parts,我在理解他关于原型(prototype)的示例之一时遇到了一些困难。书中代码如下:
if (typeof Object.create !== "function") {
Object.create = function(o) {
var F = function () {}
F.prototype = o;
return new F;
};
}
我假设此代码用于定位函数的原型(prototype)。但为什么要使用如此复杂的方法呢?为什么不直接使用 variable
.prototype? Crockford 是 Javascript 方面的领先专家,因此我确信使用此模型有充分的理由。谁能帮助我更好地理解它?任何帮助将不胜感激。
最佳答案
在 ECMAScript 3 中,new
运算符是设置 [[Prototype]]
的唯一标准方法对象的内部属性,在本例中,Crockford 只是使用临时构造函数 F
为此目的。
o
该方法的参数设置为 prototype
临时构造函数的属性,并通过调用 new F();
它构建了一个继承自 F.prototype
的新空对象(有关 new
工作原理的更多详细信息,请参阅 this question)。
例如:
var a = { a: 1 };
var b = Object.create(a); // b inherits from a
b.a; // 1
在上面的例子中,我们可以说 b
的内部[[Prototype]]
属性指向 a
.
Object.getPrototypeOf(b) === a; // true
换句话说,b
继承自 a
.
同样的例子,我们可以使用一个空的构造器,例如:
function F(){}
F.prototype = a;
var b = new F(); // b again inherits from a (F.prototype)
还请记住 prototype
函数的属性不同于 [[Prototype]]
所有对象都具有的属性,prototype
函数的属性在使用 new 运算符调用时使用,以构建从该属性继承的新对象。
另外,请注意,现在正在实现 ECMAScript 5 标准,而这个 shim 并没有 100% 符合规范,事实上,标准有一些特性 Object.create
方法 that cannot be emulated on ES3 .
另见:
关于javascript - 对javascript练习的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6933229/