理解javascript中的原型

理解javascript中的原型,javascript,oop,Javascript,Oop,可能重复: 来自Java背景,我正在努力理解javascript 请让我知道这些是否正确 与java一样,有一个至高无上的对象,所有其他对象都从中继承 prototype属性类似于指向父对象(java中的类)的指针 对于“Object”对象,原型为null prototype属性的值是表示对象命名法的字符串,不是C中的指针。指针概念是使用脚本中无法访问的隐藏属性[[prototype]]实现的 我使用node.js而不是browser来学习js。 我试过了 首先,在尝试使用create方法之前

可能重复:

来自Java背景,我正在努力理解javascript

请让我知道这些是否正确

  • 与java一样,有一个至高无上的对象,所有其他对象都从中继承
  • prototype属性类似于指向父对象(java中的类)的指针
  • 对于“Object”对象,原型为null
  • prototype属性的值是表示对象命名法的字符串,不是C中的指针。指针概念是使用脚本中无法访问的隐藏属性[[prototype]]实现的
  • 我使用node.js而不是browser来学习js。 我试过了


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

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

    var human = {}, man = {}, person = {};
    
    第三,这不是Java。在Java类中,理解类是非常重要的。原型在JavaScript中是完全可选的。原型提供的唯一性能优势是当您在不同范围内通过引用大量重用函数时。如果这种编码风格不适用于您,那么您可能不需要使用原型

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

    var man  = Object.create(human);
    console.log(Object.getPrototypeOf(man));
    //{}
    //expected 'human'
    
  • 是的,除了
    Object.create(null)
    之外,它不继承任何内容
  • 不确定“父对象”是什么,但函数的原型由实例可以访问的函数组成。因为
    Object.prototype.toString
    存在,
    {}.toString
    也存在,所以它是继承的
  • 是的,原型链在这里结束
  • 否,
    .prototype
    (或
    对象.getPrototypeOf
    返回的值)是一个可以用属性扩展的对象,因此这些属性由实例继承
  • 你的例子:

    var human = Object.create(null);  // same as var human;
    
    不,它创建了一个空对象,该对象不从任何对象继承<代码>var人类将
    human
    设置为
    undefined
    ——这不是一个对象,而是一个基本值(并非所有内容都是JavaScript中的对象)

    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.prototype
    ,而不是字符串。它看起来是空的,但这是因为
    对象。prototype
    的函数在默认情况下是可用的,并且是隐藏的。

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

    如果不是节点,你建议我使用什么?只使用常规js。节点主要用于服务器端javascript,这完全是另一回事。有关教程,请参见
    var person = Object.create(Object.prototype); // same as var person = {}
    console.log(Object.getPrototypeOf(person));
    //{}
    //expected 'object'