繁体   English   中英

关于javascript练习的困惑

[英]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()

第一个barfoo为原型; 第二个是Object作为原型。

此代码适用于不支持Object.create旧JavaScript实现,后者在2009年11月发布的ECMAScript 5标准中指定。

许多人说创建对象的首选方法是在创建时为其指定原型。 这可以称为differential inheritanceprototypal 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属性不是对象的原型。 给定一个函数对象ff.prototype是将被指定为通过new f()构造的所有对象的原型的对象。 对象的真实原型称为[[prototype]]__proto__但您无法在标准ECMAScript中访问它们。 令人困惑,是吗?

作为旁注。 ES5规范具有比Crockford定义的更强的Object.prototype规范。 它需要第二个对象来配置正在定义的对象的属性。

给定传递的对象作为原型,此create方法将实例化一个新对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM