关于javascript练习的困惑

dop*_*man 6 javascript oop

我刚刚得到了道格拉斯·克罗克福德的Javascript:The Good Parts,我很难理解他关于原型的一个例子.书中的代码如下:

if (typeof Object.create !== "function") {
    Object.create = function(o) {
        var F = function () {}
        F.prototype = o;
        return new F;
    };
}
Run Code Online (Sandbox Code Playgroud)

我假设这段代码用于定位函数的原型.但为什么要使用这种复杂的方法呢?为什么不直接使用variable.prototype?Crockford是Javascript领域的领先专家,所以我确信有充分的理由使用这个模型.谁能帮助我更好地理解它?任何帮助,将不胜感激.

CMS*_*CMS 5

在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
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,我们可以说b内部[[Prototype]]属性指向a.

Object.getPrototypeOf(b) === a; // true
Run Code Online (Sandbox Code Playgroud)

换句话说,b继承自a.

使用相同的示例,我们可以使用空构造函数,例如:

 function F(){}
 F.prototype = a;

 var b = new F(); // b again inherits from a (F.prototype)
Run Code Online (Sandbox Code Playgroud)

还要记住prototype,函数的[[Prototype]]属性与所有对象具有的prototype属性不同,函数的属性在使用new运算符调用时使用,以构建从该属性继承的新对象.

此外,请注意,现在,ECMAScript 5标准正在实施,并且此垫片不符合规范100%,事实上,标准Object.create方法的某些功能无法在ES3上模拟.

也可以看看: