这是来自John Resig的Learning Advanced JavaScript的#33。 http://ejohn.org/apps/learn/#33非常感谢您提供的帮助。
1)从技术上讲,ninja.changeName("Bob")
“召唤”功能忍者,或立即转到this.changeName(name);
2)调用ninja.changeName("Bob")
后,处理事件在函数Ninja(名称)中发生的顺序是什么?
3)this.changeName(name)的目的/功能究竟是什么;
function Ninja(name){
this.changeName = function(name){
this.name = name;
};
this.changeName( name );
}
var ninja = new Ninja("John");
assert( ninja.name == "John", "The name has been set on initialization" );
ninja.changeName("Bob");
assert( ninja.name == "Bob", "The name was successfully changed." );
答案 0 :(得分:1)
1)它正在调用该函数的方法。
2)它只是通过setter更新自己的name
属性。
3)使用setter来改变属性。
答案 1 :(得分:1)
这是一个非常好的问题)
是对象,因此通过调用ninja.changeName("Bob")
,您可以直接使用ninja的方法.changeName()
如果调用了ninja.changeName
,则不会触发此方法之外的任何操作
this.changeName ( name);
- 是构造函数,它们仅在创建时应用于ninja对象(用属性名扩展新创建的对象)
答案 2 :(得分:1)
1)从技术上讲,是ninja.changeName(“Bob”)“调用”函数Ninja,还是立即转到this.changeName(name);
它调用匿名函数,该函数分配给使用changeName
创建的Ninja实例的var ninja = new Ninja("John");
属性。
2)一旦调用ninja.changeName(“Bob”),处理事件在函数Ninja(name)中发生的顺序是什么?
运行该函数中的单个语句
3)this.changeName(name)的目的/功能究竟是什么;
它接受一个参数,并将该参数的值赋给调用该方法的name
实例的Ninja
属性。
答案 3 :(得分:1)
1)从技术上讲,是 ninja.changeName(“Bob”)“召唤”了 功能忍者,还是去吧 立即到this.changeName(name);
只能使用语法Ninja
调用函数Ninja(..)
。语法new Ninja(...)
并未完全调用该函数,它将其用作新对象的构造函数。语法ninja.changeName("Bob")
通过其changeName
构造函数调用附加到ninja
对象的Ninja
属性的匿名函数。 ninja.changeName("Bob")
与Ninja
函数关系不大,“技术上讲”。创建对象ninja
后,ninja.changeName
和Ninja
之间没有任何关系 。
回到你的问题:既不。它不会“调用”函数Ninja
,也不会转到this.changeName(name)
。它只调用函数ninja.changeName
,它是一个常规的匿名函数,由对象ninja
的属性引用。
2)一旦ninja.changeName(“Bob”)是 调用,顺序是什么 处理事件发生 内功能忍者(姓名)?
如上所述,两者之间存在无关系。执行ninja.changeName("Bob")
会对call
引用的匿名函数执行ninja.changeName
。 ninja.changeName
和匿名函数function(name) { this.name=name; }
之间的关联已由构造函数Ninja
设置,但这是它们之间的唯一关系。
3)究竟是什么 this.changeName的目的/功能( 名);
在构造函数中调用函数changeName
,以向您显示可以在构造函数内调用方法。您可以为对象创建setter,然后在构造函数中使用这些setter来初始化对象的属性。这个例子是教学的;在现实世界中,setter可能非常复杂,你有使用它们来初始化对象。此外,如果不使用它,创建一个setter会有什么意义,例如:
function Ninja(constructorArg) {
this.changeName = function(setterArg){
this.name = setterArg;
};
this.name = constructorArg; // I'm not using the setter I've just written
}