理解javascript中的原型

understanding Prototype in javascript

本文关键字:原型 javascript 理解      更新时间:2024-05-02

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

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

请告诉我这些是否正确。

  1. 与java一样,有一个至高无上的Object,所有其他对象都从中继承
  2. 原型属性就像一个指向父对象(java中的类)的指针
  3. 对于"Object"对象,原型为null
  4. prototype属性的值是表示对象命名法的字符串,而不是像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'
  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;human设置为undefined-这不是一个对象,而是一个基元值(在JavaScript中并不是所有东西都是对象)。

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

CCD_ 9返回对象CCD_。这是一个空对象;节点将其显示为CCD_ 11。它不是字符串。事实上,对象可以分配给多个变量。对象没有绑定变量,因此在设计中根本不可能获得字符串。要检查相等性,可以执行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的函数在默认情况下是可用的并且是隐藏的。

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

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

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

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

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

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