嵌套在其他对象中的方法是如何存储的?

How are methods, nested in other objects stored?

我有一个关于对象方法并将它们存储在其他方法中的问题 objects.How 来 obj[1]() 仍然执行旧方法,尽管它被 fn.getN1 = "test" 覆盖?我想我不能再执行它了。当我控制 .log fn 时它不存在,但它是否仍然存储在内存中的某个地方?

此外,如果您能告诉我这是否是一种不好的做法,那就太好了。这个我不是很了解

function Factory() {
    let n = 0;

    function getN1() {
        console.log(n);
    }
    
    function getN2() {
        console.log(n);
    }

    function incrN() {
        n++
    }

    return {getN1, getN2, incrN}
    
}

let fn = Factory();

let obj = {1: fn.getN1, 2: fn.incrN}

fn.getN1 = "test";
console.log(fn);

obj["2"]();

obj[1]();
fn.getN2();
console.log(fn.getN1);

当您设置对象的 属性(在本例中为 obj.1)时,它会像自己一样存储到内存中。而且它不会让你从外面改变它。

您必须这样更新参考: obj['1'] = 'text;

但是,有一个技巧可以将 属性 存储为一个函数,该函数将按照当前定义的方式执行 fn 的函数。

let fn = Factory();
let obj = {1: function(){ fn.getN1()}, 2: function(){ fn.incrN()}}

if(typeof fn.getN1 == 'function')
  obj['1']()
else
  console.log(fn.getN1)

fn.getN1 = "text";

if(typeof fn.getN1 == 'function')
  obj['1']()
else
  console.log(fn.getN1)

注意* 你需要使用 typeof 因为它看起来你可以将 getN1 从函数切换到不是函数的东西(在这种情况下“文本”=字符串)如果您想摆脱必须一直检查“typeof”的麻烦,然后将 getN1 更新为此 fn.getN1 = function(){}; <- 这基本上是一个什么都不做的函数。

一个 Object in JavaScript is a collection of properties. Each property consists of a String (or Symbol) 名称、一个值和一组属性。

在JavaScript中,函数是对象。当您创建一个函数对象(例如 function foo() {})时,会在堆上创建一个相应的对象,并且对该对象的引用可供您(程序员)使用,因此您可以使用它(这里:那个引用分配给标识符 foo).

因此,在 JavaScript 中,您可能会说对象(和函数是对象)是“通过引用”传递的;出于性能原因,实际对象永远不会被复制,而是传递对它们的引用(如指针,but more convenient to use)。

在下文中,对 fn1 上名称为 'getN1' 的 属性 的值引用的函数对象的引用被复制到值位置属性 名称为 '1' 的新对象(使用 object initializer (or 'object literal') syntax 创建)。然后将对此新创建的对象的引用分配给名为 obj:

的变量
let obj = { 1: fn.getN1 }

并且在下文中,与对象 fn 上名称为 'getN1' 的 属性 关联的值更改为字符串 'test',覆盖先前的值其中 属性。 对象obj保持不变:

fn.getN1 = "test"