3

可能重复:
JavaScript .prototype 是如何工作的?

来自 Java 背景,我正在尝试理解 javascript。

请让我知道这些是否正确。

  1. 就像在java中一样,有一个至高无上的对象,所有其他对象都继承自该对象。
  2. 原型属性就像一个指向父对象的指针(java中的类)
  3. 对于“Object”对象,原型为空。
  4. 原型属性的值是表示对象命名法的字符串,而不是像 C 中的指针。指针概念是使用隐藏属性实现的,[[PROTOTYPE]] 在脚本中无法访问。

我正在使用 node.js 而不是浏览器来学习 JS。我试过了,

var human = Object.create(null);  // same as var human;
console.log(Object.getPrototypeOf(human)); //null

var man  = Object.create(human);
console.log(Object.getPrototypeOf(man));
//{}
//expected 'human'

var person = Object.create(Object.prototype); // same as var person = {}
console.log(Object.getPrototypeOf(person));
//{}
//expected 'object'
4

3 回答 3

0

首先,IMO,不要从节点开始。如果你还不知道 javascript,Node 会把你拖入流沙池。其次,当我开始使用基于函数的代码时,然后是 OO,然后我才转向原型。但如果你真的想知道,这个问题已经在这里回答过。如果您还有其他问题,请随时问我!

于 2012-07-27T18:12:06.527 回答
0

create首先,在尝试使用它之前,您需要阅读有关该方法的信息。

其次,通过以下方式调用对象:

var human = {}, man = {}, person = {};

第三,这不是Java。在 Java 中,类和对类的理解非常重要。原型在 JavaScript 中是完全可选的。原型提供的唯一性能优势来自于您的代码在不同范围内通过引用大量重用函数。如果这种编码风格不适用于您,那么您可能不需要使用原型。

原型是从父对象或某些祖先对象继承而来的。JavaScript 解析器将首先查找本地分配,如果不存在,则检查当前对象的原型是否存在命名引用。简而言之,这是您在编写 JavaScript 的早期阶段需要了解的所有内容。

于 2012-07-27T18:10:48.947 回答
0
  1. 是的,除了Object.create(null)它不继承任何东西。
  2. 不确定“父对象”是什么,但函数的原型由实例可访问的函数组成。因为Object.prototype.toString存在,所以存在{}.toString——它是继承的。
  3. 是的,原型链到此结束。
  4. 不,.prototype(或返回的值Object.getPrototypeOf)是一个可以使用属性扩展的对象,以便这些属性由实例继承。

你的例子:

var human = Object.create(null);  // same as var human;

不,它创建了一个不继承任何东西的空对象。var human;设置humanundefined- 这不是一个对象,而是一个原始值(在 JavaScript 中并非所有东西都是对象)。

var man  = Object.create(human);
console.log(Object.getPrototypeOf(man));
//{}
//expected 'human'

Object.getPrototypeOf(man)返回对象human。这是一个空对象;节点将其显示为{}。它不是一个字符串。事实上,对象可以分配给多个变量。一个对象没有绑定到它的变量,所以从设计上来说根本不可能得到一个字符串。要检查相等性,您可以执行Object.getPrototypeOf(man) === humanwhich yield true

var person = Object.create(Object.prototype); // same as var person = {}
console.log(Object.getPrototypeOf(person));
//{}
//expected 'object'

这确实与{}- 直接继承自的空对象相同Object。如上所述,原型是Object.prototype而不是字符串。它看起来是空的,但那是因为Object.prototype's 函数在默认情况下是可用的并且是隐藏的。

于 2012-07-27T18:10:50.337 回答