我定义了我的方法
var setAge = function (newAge) {
this.age = newAge;
};
我做苏珊
var susan = new Object();
susan.age = 25;
susan.setAge = setAge;
我调用方法
susan.setAge(35);
那么,为什么"我的第3行让苏珊" blockquote必要吗? (susan.setAge = setAge)。
假装我们删除该行。为什么javascript直观地认识到susan.setAge(35)在我的第一个blockquote中引用了setAge方法? (我觉得代码可能更简单)
我们是否需要严格的定义以便我们不会意外地调用另一种方法? 已经很晚了,我是全新的,而且我的大脑很模糊。我很感激任何帮助。谢谢!
答案 0 :(得分:4)
为什么javascript不能直观地认识到susan.setAge(35)在我的第一个blockquote中引用了setAge方法? (我觉得代码可能更简单)
我认为javascript 可以以这种方式实现,但事实并非如此。我已经看到proposal有类似的生锈特征,这引发了很多讨论。
我觉得代码可能更简单
除了javascript函数具有的call()
方法之外,您可能还想了解对象prototypes的工作方式:
//A new type of object, called Person
var Person = function(){};
Person.prototype.setAge = function(age) { this.age = age };
var susan = new Person();
susan.setAge(35);
答案 1 :(得分:2)
没有susan
部分,JS引擎不知道您希望在函数中使用susan
作为this
。我认为你做了一个奇怪的假设,即susan.setAge = setAge
会修改你最初定义的函数的行为,这与susan
完全无关。
一般来说,当你调用一个函数时,在.
之前出现的任何东西都将被用作函数内的this
(除非它是一个"绑定函数" )。如果您不使用点符号并直接调用函数,this
将是全局对象(在"草率模式")或null
(在&#中34;严格模式")。
调用函数并获得预期结果的另一种方法是:
setAge.call(susan, 35);
答案 2 :(得分:1)
我相信你对结果感到困惑,因为它符合你的预期。也就是说,最后,你希望苏珊的年龄设置为35,因为你调用了setAge()函数来执行此操作,并使用susan调用它。但事实并非如此。实际上发生的事情更像是......
您定义了一个全局函数setAge()
- 您可以在没有susan
的情况下调用它。这样做会在全局上下文中调用它,如果它还不存在,将添加属性window.age
。
您定义了一个全局对象susan
。实际上这是在全局范围内,所以现在你有window.susan
(对象)和window.setAge
(函数)。
您在名为susan
的{{1}}上定义了一个属性,为其指定了您在步骤1中定义的函数的值。setAge
上此属性的名称可以是任何内容。它只是某个值的别名,在这种情况下,您已将其设为函数的别名,该函数恰好采用相同的名称。
检索susan
的{{1}}属性值,这是一个函数,然后执行它,将susan
作为参数传递 - 最终将全局函数传递给它setAge
的执行范围为35
(意味着setAge()
中的susan
在this
执行时基本上被setAge()
替换)
为了减轻一些困惑,请尝试更改
susan
到
setAge()
如果您尝试调用susan.setAge = setAge;
,则现在会收到javascript错误,因为它未定义。对象susan.AgeSetter = setAge;
没有属性susan.setAge(35);
,而是属性susan
。当你致电setAge
时,一切都会再次发挥作用。
我认为您期望这种方式发挥作用的方式更多的是实用方法call和apply。
使用调用或应用,您的全局函数AgeSetter
不会更改,susan.AgeSetter(35)
也不会更改,setAge()
除外没有属性susan
。相反,您可以使用susan
或setAge()
调用setAge()
,强制上下文为susan
(现在您只需要知道它们基本相同但你用显式参数调用调用并使用一系列参数来实现。
所以脚本看起来像......
call
答案 3 :(得分:0)
它会打破变量范围。
最初,setAge
只是一个变量,它的值是一个匿名函数。
setAge
对象的susan
属性未定义,直到您使其等于在对象范围之外定义的变量的值。如果JavaScript直观地知道susan.setAge
与setAge
(在susan
Object
之外定义)相同,则意味着您无法定义任何变量在对象定义之外,不必担心它们会与对象的属性发生碰撞。