js中new 一个对象发生了啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js中new 一个对象发生了啥?相关的知识,希望对你有一定的参考价值。

参考技术A 最近在面试的时候,都会被问到在js中,new 一个实例的过程,

比如 :

定义了一个函数Person,里面有三个属性:name,age,sex;当var lisi = new Person() 的时候发生了以下4件事:

1.  var obj= ,创建了一个空对象 obj, 也就是开辟了一块内存地址,新建了一个对象实例(我是这样认为的,如果有不对的欢迎指出);

2. obj.__proto__ = Person.prototype ; 将 lisi 这个空对象的 __proto__ 指向 Person 的 prototype ,也就是设置原型链;

3. var result = Person.call(obj) ,改变this的指向,让this指向 obj 对象 ;

4。判断Person的返回值类型,如果是引用类型,则返回这个引用类型的对象,如果是普通值类型,就返回obj;

现在来看看打印出的内容:

可以看出lisi这个实例对象的构造函数是Person。

对于每个未发送到后续函数的循环值。这里发生了啥?节点.js

【中文标题】对于每个未发送到后续函数的循环值。这里发生了啥?节点.js【英文标题】:For each loop value not being sent to subsequent function. What is happening here? Node.js对于每个未发送到后续函数的循环值。这里发生了什么?节点.js 【发布时间】:2021-03-25 11:15:22 【问题描述】:

我已经在这个项目上工作了三天,我几乎可以理解我所做的一切以及为什么一个值会引发错误,但是在这段代码中:

function updateStats()
    const users = readFile('users','txt','UTF-8');
    users.forEach((v) =>     
        console.log(v);
        var user =  v.toString();
        const statFile = readFile(user,'txt','UTF-8');
        readHTTP(v,currentChannel,statFile[0]);
    );

抛出错误:

I am doing my 15 minutes update
610636905440215071
677257430249242655
539899963568553986
525819952708583427
373982165307752460

Error: ENOENT: no such file or directory, open '/Users/codel/OneDrive/Documents/BattlEye/files/.txt'
    at Object.openSync (fs.js:476:3)
    at Object.readFileSync (fs.js:377:35)
    at readFile (C:\Users\codel\OneDrive\Documents\BattlEye\index.js:98:25)
    at C:\Users\codel\OneDrive\Documents\BattlEye\index.js:214:26
    at Array.forEach (<anonymous>)
    at updateStats (C:\Users\codel\OneDrive\Documents\BattlEye\index.js:211:11)
    at Timeout._onTimeout (C:\Users\codel\OneDrive\Documents\BattlEye\index.js:27:3)
    at listOnTimeout (internal/timers.js:554:17)
    at processTimers (internal/timers.js:497:7) 
  errno: -4058,
  syscall: 'open',
  code: 'ENOENT',
  path: '/Users/codel/OneDrive/Documents/BattlEye/files/.txt'

C:\Users\codel\OneDrive\Documents\BattlEye\index.js:215
        readHTTP(v,currentChannel,statFile[0]);
                                          ^

TypeError: Cannot read property '0' of undefined
    at C:\Users\codel\OneDrive\Documents\BattlEye\index.js:215:43
    at Array.forEach (<anonymous>)
    at updateStats (C:\Users\codel\OneDrive\Documents\BattlEye\index.js:211:11)
    at Timeout._onTimeout (C:\Users\codel\OneDrive\Documents\BattlEye\index.js:27:3)
    at listOnTimeout (internal/timers.js:554:17)
    at processTimers (internal/timers.js:497:7)

我假设它与函数结构有关,但我的其他 foreach 循环在这种语法中运行得很好。有人可以帮忙调试一下吗?

编辑: 读取文件:

function readFile(fileName,fileType,fileFormat)
    try 
        const data = fs.readFileSync('/Users/codel/OneDrive/Documents/BattlEye/files/'+fileName+'.'+fileType, fileFormat);
        const lines = data.split(/\r?\n/);
        return lines;
     catch (err) 
        console.error(err);
    

读取HTTP:

function readHTTP(user,cc,userID)
    const puppeteer = require('puppeteer');
    var url= 'https://r6.tracker.network/profile/pc/' + userID;
    (async() => 
        const browser = await puppeteer.launch();
        const page = await browser.newPage();
        try 
        await page.goto(url);
         catch(error)
            cc.send('You did not enter a valid Ubisoft UserID');
        
        const data = await page.evaluate(() => 
            return Array.from(document.querySelectorAll('.trn-defstat__value'))
                    .map(item => item.innerText);
        ); 
        writeStatFile(user,userID,data);
        console.log("Personal stats file was written");
    )();

前两天刚学了这门语言,但是值并没有通过for each循环传递给后面的函数。

【问题讨论】:

它似乎无法读取文件users,因此您无法在users 上运行forEach()。检查您尝试读取的文件名。 @Ozgur Sar 我添加了带有完整日志的编辑。它读取 users.txt,但在搜索 user.txt 文件时,未发送该值。完整的日志显示 console.log(v) 正在输出我需要的值。 请贴出readFile(也可能是readHTTP)的代码,否则我们无能为力。 使用调试器检查v/user的值是多少。我敢打赌:你的 users.txt 以换行符结尾,最后一个 v 是空字符串。 @Bergi 我认为你是对的。我阅读文件的方式与分割每一行有关。你是对的。这只是一个未被捕获的空白。 【参考方案1】:

错误号:-4058, 系统调用:'打开', 代码:'ENOENT', 路径:'/Users/codel/OneDrive/Documents/BattlEye/files/.txt'

寻找异步问题的一个很好的理由。

试试这个:

const promises = require('fs').promises

const updateStats = async () => 
  try 
    const users = await promises.readFile('users.txt', encoding: 'utf8');
    for (let user of users.split("\n")) 
      const statFile = await promises.readFile(user.toString() + '.txt', encoding: 'utf8');

      if(statFile && statFile[0]) 
        readHTTP(user,currentChannel,statFile[0]);
      
    
   catch(err) 
    console.error(err.toString())
  

不确定这是否可行,因为我没有时间测试它。

真的希望这会有所帮助:)

【讨论】:

【参考方案2】:

几乎可以肯定,users.txt 中有一个空换行符

我会做以下事情:

function updateStats()
    const users = readFile('users','txt','UTF-8');
    users.forEach((v) => 
        if (v === '') return
        console.log(v);
        var user =  v.toString();
        const statFile = readFile(user,'txt','UTF-8');
        readHTTP(v,currentChannel,statFile[0]);
    );


【讨论】:

以上是关于js中new 一个对象发生了啥?的主要内容,如果未能解决你的问题,请参考以下文章

new关键字具体做了啥?

在将一个对象分配给另一个对象时,实际发生了啥,保留对象还是整个副本?

对于每个未发送到后续函数的循环值。这里发生了啥?节点.js

打印一个nil对象编译器说“unresolved identifier”后面发生了啥?

nodejs中require的路径是一个文件夹时发生了啥

比较两个包含对象的数组以计算发生了啥变化?