嵌套在其他对象中的方法是如何存储的?
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"
我有一个关于对象方法并将它们存储在其他方法中的问题 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"