javascript - JS 墙上的又一 block 砖

标签 javascript node.js anonymous-function object-literal

我必须承认,JavaScript 有时会有奇怪的行为。

var Npc = function() {
    this.name='Hello world';
}

Npc.attr='my new attribute';

console.log('>>>>'+Npc.attr);               // my new attribute
console.log('>>>>'+Npc.name);               // '' ????

var data = new Npc();

console.log('>>>>>' + data.attr);           // undefined
console.log('>>>>>' + data.name);           // Hello world

我听起来很奇怪。 如果我能理解 .name 差异(实例与文字),我就无法理解“attr”行为。

这是一头牛吗?但是使用 Node.js 调试器我确实看到了 attr 属性!?

哇...

最佳答案

这很正常。

var Npc = function() {
    this.name='Hello world';
}

是一个函数构造函数,在执行该函数之前不会发生任何事情并且名称不存在,这是有意义的。

所以此时仅定义了 attr。

var data = new Npc();

console.log('>>>>>' + data.attr);           // undefined
console.log('>>>>>' + data.name);   

var data = new Npc(); 返回一个新对象,这是有意义的,因为您正在使用 new

如果你想访问 attr,你需要在新对象中找到对 Npc 的引用

data.constructor.attr 是你可以找到 attr 的地方

编辑

  • 纠正了 data.constructor.attr 上的小错误

关于javascript - JS 墙上的又一 block 砖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22561849/

相关文章:

javascript - 如何根据内容调整容器的大小而不重复相同的代码行?

javascript - 在 for 循环中使用 async/await 并不等待异步方法调用

javascript - 访问 javascript 中的内部函数

function - 创建函数字典的更好方法

javascript - 与 OO 相比,编写 "functional"Javascript 有什么好处?

javascript - 具有多个更改的扩展属性 : one-liner ecma immutability

javascript - 使用javascript在IE中打开多个iframe

node.js - 使用管道语法解压缩流响应

mysql - 在node中查询mysql后res.render无法获取结果参数

javascript - 遍历元素数组获取数据