2012-07-27 73 views
2

可能重复:
How does JavaScript .prototype work?理解原型在JavaScript

从Java背景的人,我试图理解JavaScript。

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

  1. 就像在java中,有一个最高级的对象,所有其他对象从中继承。
  2. 原型属性就像一个指向父对象的指针(在java中的类)
  3. 对于“Object”对象,原型为null。
  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' 
+0

[这里是一篇不错的和详细的文章,它可能会帮助你很多方面](http://conceptf1.blogspot.com/2013/11/javascript-prototype-property-and-Inheritance.html) – 2013-11-15 17:08:37

回答

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; sets humanundefined - 这不是一个对象,而是一个原始值(并非所有东西都是JavaScript中的对象)。

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

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

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

这确实是相同{} - 直接从Object继承一个空对象。如上所述,原型是Object.prototype而不是字符串。它看起来是空的,但这是因为Object.prototype的功能默认和隐藏。

0

首先,你需要阅读有关create方法尝试使用它之前。

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

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

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

原型是从父项或某个祖先对象继承的。 JavaScript解析器将首先查找本地分配,如果不存在,则将检查当前对象的原型是否存在已命名的引用。简而言之,在编写JavaScript的这个早期阶段你需要知道的一切。

0

首先,IMO,不要从节点开始。如果您还不知道JavaScript,节点会将您拖入一堆流沙中。其次,当我开始使用基于功能的代码时,然后是OO,然后才转向原型。但如果你真的想知道,这个问题已经通过here回答。随时问我是否有任何问题!

+0

如果不是节点,你有什么建议我使用? – John 2012-07-27 19:02:37

+0

只需使用普通的js。节点主要用于服务器端JavaScript,这是一个完整的球场。有关教程,请参见[w3schools](http://www.w3schools.com/js/default.asp) – Kpower 2012-07-28 00:40:48