【问题标题】:Don't understand JavaScript prototype不懂 JavaScript 原型
【发布时间】:2012-07-07 23:32:50
【问题描述】:

我正在阅读 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);

输出是'函数'?

【问题讨论】:

  • 我认为this link 解释得更好。
  • Object.create 是在最新的 js 标准 ES5 中添加的。 JavaScript: The Good Parts 是在那之前写的。这就是为什么typeof Object.createfunction
  • @Zirak Gotcha。另一个问题。这个方法定义试图实现什么。对不起我的无知。我阅读了人们给我的链接,但我仍然不明白。

标签: javascript prototype


【解决方案1】:

要回答您的“首先...”,您可能仍会遇到 Javascript 环境

console.log(typeof Object.create);

将报告

undefined

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

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

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

Crockford 的代码正在使用旧技术来模拟新技术的部分功能。 Object.create 定义了一些通过旧机制无法真正实现的行为,但最基本的行为只是简单地创建一个原型为指定对象的新对象。这正是使用F.prototype = o; return new F(); 完成的旧技术。因此,这段代码几乎是将新行为填充到旧环境中的标准方法。另一个例子,见MDN create page

【讨论】:

  • 这个方法想达到什么目的?你能举个例子说明它在哪里有用吗?
  • 这就是我试图对上面的长帖子做的事情。 :-( 代码试图在没有的环境中为您提供Object.create 的大部分工作版本。Object.create 是一种使用指定原型对象创建对象的更简单方法。
猜你喜欢
  • 1970-01-01
  • 2020-12-18
  • 2017-11-16
  • 2014-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多