[英]confusion about javascript exercise
我刚刚得到了道格拉斯·克罗克福德的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领域的领先专家,所以我确信有充分的理由使用这个模型。 谁能帮助我更好地理解它? 任何帮助,将不胜感激。
在ECMAScript 3中, new
运算符是设置对象[[Prototype]]
内部属性的唯一标准方法,在这种情况下,Crockford只是为此目的使用临时构造函数 F
该方法的o
参数被设置为临时构造函数的prototype
属性,并通过调用new F();
它构建了一个继承自F.prototype
的新空对象(有关new
工作原理的更多详细信息,请参阅此问题 )。
例如:
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标准正在实施,而且这个垫片不符合规范100%,事实上,标准的Object.create
方法有一些功能无法在ES3上模拟 。
也可以看看:
var bar = Object.create(foo)
与
var bar = new Object()
第一个bar
以foo
为原型; 第二个是Object
作为原型。
此代码适用于不支持Object.create
旧JavaScript实现,后者在2009年11月发布的ECMAScript 5标准中指定。
许多人说创建对象的首选方法是在创建时为其指定原型。 这可以称为differential inheritance
或prototypal inheritance
。 实际上,这就是Object.create
作用:
var protoCircle = {x: 0, y: 0, radius: 1, color:"black"};
var myCircle = Object.create(protoCircle);
myCircle.x = 3;
myCircle.color = "green";
这使得半径为1的绿色圆圈以(3,0)为中心。
代码如此复杂以至于在将Object.create
添加到JavaScript之前, 设置对象原型的唯一方法是使用new
运算符创建它 。 使用new
创建的对象作为其原型获取构造函数的prototype
属性的值。 这绝对令人困惑,但prototype
属性不是对象的原型。 给定一个函数对象f
, f.prototype
是将被指定为通过new f()
构造的所有对象的原型的对象。 对象的真实原型称为[[prototype]]
或__proto__
但您无法在标准ECMAScript中访问它们。 令人困惑,是吗?
作为旁注。 ES5规范具有比Crockford定义的更强的Object.prototype
规范。 它需要第二个对象来配置正在定义的对象的属性。
给定传递的对象作为原型,此create方法将实例化一个新对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.