对象,构造函数及其方法之间的关系

时间:2011-03-17 07:01:03

标签: javascript

这是来自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." );

4 个答案:

答案 0 :(得分:1)

1)它正在调用该函数的方法。

2)它只是通过setter更新自己的name属性。

3)使用setter来改变属性。

答案 1 :(得分:1)

这是一个非常好的问题)

    JS函数中的
  • 是对象,因此通过调用ninja.changeName("Bob"),您可以直接使用ninja的方法.changeName()

  • 如果调用了ninja.changeName,则不会触发此方法之外的任何操作

  • this.changeName ( name); - 是构造函数,它们仅在创建时应用于ninja对象(用属性名扩展新创建的对象)

看看this great book on OOP in JS

答案 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.changeNameNinja之间没有任何关系

回到你的问题:既不。它不会“调用”函数Ninja,也不会转到this.changeName(name)。它只调用函数ninja.changeName,它是一个常规的匿名函数,由对象ninja的属性引用。

  

2)一旦ninja.changeName(“Bob”)是   调用,顺序是什么   处理事件发生   内功能忍者(姓名)?

如上所述,两者之间存在无关系。执行ninja.changeName("Bob")会对call引用的匿名函数执行ninja.changeNameninja.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
}