在javascript中理解Prototype

时间:2012-07-27 17:57:33

标签: javascript oop

  

可能重复:
  How does JavaScript .prototype work?

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

如果这些是正确的,请告诉我。

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

3 个答案:

答案 0 :(得分:0)

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

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

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

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

原型继承自父级或某些祖先对象。 JavaScript解析器将首先查找本地分配,如果不存在,则将检查当前对象的原型是否存在命名引用。简而言之,在编写JavaScript时,您需要了解这一点。

答案 1 :(得分:0)

  1. 是的,Object.create(null)除外,它不会从任何内容继承。
  2. 不确定“父对象”是什么,但函数的原型包含实例可访问的函数。由于Object.prototype.toString存在,{}.toString也存在,因此继承了
  3. 是的,原型链在这里结束。
  4. 不,.prototype(或Object.getPrototypeOf返回的值)是一个可以使用属性扩展的对象,以便这些属性由实例继承。
  5. 您的示例:

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

    不,它会创建一个不会从任何东西继承的空对象。 var human;human设置为undefined - 这不是对象而是原始值(并非所有内容都是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的功能是可用的并且是隐藏的。

答案 2 :(得分:0)

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