5

Objectクラスには、メソッドと関数の両方があります。つまり、両方にObject.nameOfMethodOrFunction()を介してアクセスします。次の質問メソッドと関数の違いは、メソッドと関数の違いを説明していますが、オブジェクト内でそれらを作成する方法については説明していません。たとえば、以下のコードはメソッドsayHiを定義します。しかし、同じオブジェクト内で関数をどのように定義しますか?

var johnDoe =
{
      fName : 'John',
      lName: 'Doe',
      sayHi: function()
      {
        return 'Hi There';
      }
};
4

3 に答える 3

7

以下は、2つのクラス、ClassAおよびを定義しますClassB。機能は同じですが、性質が異なります。

function ClassA(name){
    this.name = name;
    // Defines method ClassA.say in a particular instance of ClassA
    this.say = function(){
        return "Hi, I am " + this.name;
    }
}

function ClassB(name){
    this.name = name;
}
// Defines method ClassB.say in the prototype of ClassB
ClassB.prototype.say = function(){
    return "Hi, I am " + this.name;
}

以下に示すように、使い方に大きな違いはなく、どちらも「方法」です。

var a = new ClassA("Alex");
alert(a.say());
var b = new ClassB("John");
alert(b.say());

では、コメントとして提供したmsdnリンクによると、「関数」の意味は、C#やJavaのように「関数」は単なる「静的メソッド」のように見えますか?

// So here is a "static method", or "function"?
ClassA.createWithRandomName = function(){
    return new ClassA("RandomName"); // Obviously not random, but just pretend it is.
}

var a2 = ClassA.createWithRandomName(); // Calling a "function"?
alert(a2.say()); // OK here we are still calling a method.

だからこれはあなたがあなたの質問に持っているものです:

var johnDoe =
{
      fName : 'John',
      lName: 'Doe',
      sayHi: function()
      {
        return 'Hi There';
      }
};

OK、これはですがObject明らかにクラスではありません。

于 2012-12-30T06:56:40.177 に答える
0
var johnDoe = {
  fName: 'John',
  lName: 'Doe',
  sayHi: function(){
    function message(){ return 'Hi there'; }
    return message();
  }
};

これは、JavaScriptで「クラス」を作成するオブジェクト宣言メソッドで得られるものとほぼ同じです。関数はsayHiのスコープ内でのみ有効であることに注意してください。

ただし、関数をクラス構造として使用する場合は、もう少し柔軟性があります。

var johnDoe = function(){
  this.publicFunction = function(){
  };
  var privateFunction = function(){
  };
};
var jd = new johnDoe();
jd.publicFunction(); // accessible
jd.privateFunction(); // inaccessible

(ただし、どちらもオブジェクトのスコープにアクセスできるため、実際にはメソッドと見なされます)。

于 2012-12-30T06:43:50.273 に答える
0

「メソッドはオブジェクト上にあります。関数はオブジェクトから独立しています」とAaronを引用します。

論理的には、「this」が定義されていないとメソッドは役に立ちません。

この例を考えてみましょう。

var johnDoe =
{
    fName: 'John',
    lName: 'Doe',
    sayHi: function () {
        return 'Hi There, my name is ' + this.fName;
    }
};

function sayHi2() {
    return 'Hi There, my last name is ' + this.lName;
}

//Will print Hi there, my first name is John
alert(johnDoe.sayHi());

//An undefined will be seen since there is no defined "this" in SayHi2.
alert(sayHi2());

//Call it properly now, using the oject johnDoe for the "this"
//Will print Hi there, my last name is Doe.
alert(sayHi2.call(johnDoe));
于 2012-12-30T07:04:11.467 に答える