不懂JavaScript原型

时间:2012-07-07 23:32:51

标签: javascript prototype

我正在阅读JavaScript Good Parts。有一个例子:

if (typeof Object.create !== 'function') {
    Object.create = function(o) {
        var F = function(){};
        F.prototype = o;
        return new F();
    }
}

有人可以向我解释这意味着什么吗?首先,Object已经有一个具有此名称的方法,因为当我运行它时:

console.log(typeof Object.create);

输出是'功能'?

1 个答案:

答案 0 :(得分:2)

要回答“开头......”,您可能仍会遇到

的Javascript环境
console.log(typeof Object.create);

将报告

undefined

或其他一些(假设你甚至有一个带有日志功能的控制台对象。)外部if (typeof Object.create !== 'function')包装器的原因是只在你的JS环境还没有这样做的情况下定义它。有许多旧的浏览器和其他环境,您的代码可能会在一天内运行,但可能无法定义Object.create

现在关于这个实际函数是如何工作的,它基于JS处理对象的方式。对象只是命名属性的集合,或者是String名称和属性值之间更恰当的关联。但是许多人也有一个特殊的财产,即prototype。这只是指向另一个对象的指针。该对象也可以拥有自己的prototype对象,依此类推。但是,最终,当其中一个对象的prototype为空时,原型链就会消失。这些原型对象也是命名属性的集合,当Javascript引擎在您的对象中搜索命名属性时,如果它没有直接在您的对象上找到它,它会检查您的对象的原型是否可能包含它,如果不是,如果该对象的原型可能包含它,依此类推,直到链断开。

这些原型对象的重点是它们可以共享。几个对象,甚至几百万个对象,可以共享一个原型。这与基于类的继承方案的工作方式大不相同,但通常可以用于类似的目的。您可以定义函数的单个副本,并且从公共构造函数创建的所有对象都将使用该副本。在创建Object.create等技术之前,这是在Javascript中进行面向对象编程的唯一真正方法。

Crockford的代码正在使用旧技术来模拟新技术应该做的部分内容。 Object.create定义了一些通过旧机制无法实现的行为,但最基本的行为只是创建一个原型为指定对象的新对象。这正是使用F.prototype = o; return new F();完成的旧技术。因此,此代码几乎是将新行为填充到旧环境中的标准方法。有关其他示例,请参阅MDN create page