javascript - 对javascript练习的困惑

标签 javascript oop

我刚拿到 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/

相关文章:

javascript - Web组件自定义元素传递函数onClick

javascript - 如果已经在 jquery 中的第一行中选中,则防止在第二行中选中复选框

我可以使用 C 进行面向对象编程吗?

php - 一个论坛的OOP实现

java - 使用private关键字

java - 实体是否应该持有对存储库的引用?

delphi - 将 protected 部分中的方法访问限制为少数类

javascript - 使用requirejs优化器统一一个JS文件

javascript - 在文本框中输入内容后,jquery 函数不起作用

javascript - 如何在vue js中获取输入类型中的预填充数据