Javascript callstack的行为以及.defineProperty方法期间的此操作 预处理:

Javascript callstack的行为以及.defineProperty方法期间的此操作 预处理:,javascript,object,properties,this,callstack,Javascript,Object,Properties,This,Callstack,如果你找到了答案,请跳到下面的实际问题 “背景故事”在这里是不必要的。但我确实相信它能增加大量的能量 问题的细节和进一步背景 最近我对物体和[[原型]]链做了一些实验 首先,我很困惑,为什么我的this引用返回一个带有以下代码的NaN: var obj={ a:2 } Object.definePropertyobj,“b”{ 值:这个.a+2, 可枚举:true }; console.logobj.b;1为什么console.trace只返回匿名 一旦您意识到您不正确地使用了console.

如果你找到了答案,请跳到下面的实际问题 “背景故事”在这里是不必要的。但我确实相信它能增加大量的能量 问题的细节和进一步背景

最近我对物体和[[原型]]链做了一些实验

首先,我很困惑,为什么我的this引用返回一个带有以下代码的NaN:

var obj={ a:2 } Object.definePropertyobj,“b”{ 值:这个.a+2, 可枚举:true }; console.logobj.b;1为什么console.trace只返回匿名 一旦您意识到您不正确地使用了console.trace,这种行为就会变得明显。如果您转到Mozilla手册并查找console.trace,您将看到它应该是这样使用的:

function foo() {
  function bar() {
    console.trace();
  }
  bar();
}

foo();
这将提供以下输出:

bar
foo
<anonymous>
您还必须知道,当您在主执行上下文中运行代码(例如从devtools控制台调用代码)时,这指的是窗口对象。窗口没有属性a,这就是为什么此.a未定义的原因

更有趣的是,在执行Object.prototype.a=2之后,这个.a或window.a变为2。这是因为窗口毕竟还是一个对象。如果将某些属性指定给对象的原型!!!,您将在代码中的所有对象上使用此属性!令人困惑对现在,我只想说,根据您的描述,您打算做的可能是:

obj.prototype = {a: 2};
或者这个:

var proto = {}; // First create a prototype
obj.prototype = proto; // Then assign it to the prototype property of your obj
obj.prototype.a = 2; // Now we can alter props on the prototype
看到区别了吗?这更有意义吗?当然,执行此操作后,代码将不再工作,因为this.a将再次变得未定义

结果如下:走这种路,你无法达到你期望的行为。属性描述符参数3实际上比值和可枚举的组合更强大,如果在其上实现set&get方法,您应该能够获得所需的行为。此外,我相信您可以使用代理来获得类似的行为。不提供更多细节,而是建议您先阅读函数执行上下文,然后再了解一些原型,也许还有一些关于堆栈溢出的好问题。之后,您可以尝试研究建议的解决方案

var proto = {}; // First create a prototype
obj.prototype = proto; // Then assign it to the prototype property of your obj
obj.prototype.a = 2; // Now we can alter props on the prototype