3

関数がJSのオブジェクトであることに同意します。関数をコンストラクターとして使用する場合、これらのプロパティを関数のプロトタイププロパティに追加することで、オブジェクト作成にプロパティを追加できます。これは私が試したものです:

var Mammal = function(name) {
    this.name = name;
};

var Cat = function(name) {
    this.saying = 'meow';
};

Cat.prototype = new Mammal();

Cat.prototype.display = function() {
    console.log('I display Cats');
};

//This is what I find hard to digest
Cat.display = function() {
    console.log('I display cats but at the top level');
};

わかりにくいのはコメント部分です。私はただ何がどこに行くのか、そして私が理解していないこの特定の部分を想像しようとしていました。つまり、関数を記述して、関数を定義しながらこのようなことをしなければならない場合、構文はどのようになりますか?次のようなことを試してみると:

function demo() {
    this.saying = function() {
        console.log('I display cats but at the top level');
    };
};

ここでの変数thisはDOMWindowを参照します。関数定義内で上記のことを実現するにはどうすればよいですか。

私はJSの全くの初心者です。ご不便をおかけして申し訳ございません。

4

3 に答える 3

1

質問は完全に明確ではありません...

ただし、次のコードを検討してください。

function Test(title) { // object constructor (class)
    this.title = title;
}

Test.prototype.getTitle = function () { return this.title }; // shared (inherited) getter method
Test.version = 1; // static property (no need to instantiate an object)

var obj = new Test('hello, world!'); // an instance of the 'Test' class
console.log(obj.constructor.version); // reference to a static property of the class

new関数がキーワードと一緒に呼び出されると、それはコンストラクターであり、構築thisされているオブジェクトを指します(new Test('hello, world!'))。

関数がオブジェクトメソッド(たとえばobj.getTitle())として呼び出されると、thisそのオブジェクトを指します。

関数が通常呼び出されると(Test('hello, world!'))、グローバルオブジェクト( Windowthis )を指します。

これは役に立ちますか?:)

于 2012-04-04T17:40:18.943 に答える
1

これらは、クラスベースのオブジェクトの静的メソッドに類似しています。つまり、メソッドには、インスタンス自体からではなく、コンストラクターからのみアクセスできます。

こののjQuery.get()の良い例あなたはできません

$('.someclass').get(myUrl);

あなたは使用する必要があります

$.get(myUrl);

ただし、インスタンスから静的メソッドにアクセスする必要がある場合は、2つのオプションがあります

var cat = new Cat('catName');
cat.constructor.display();
Cat.display();

http://jsfiddle.net/c39bW/

Catのコンストラクタープロパティが壊れているわけではありません。継承を設定するときは、Cat.prototype.constructorを修正してCatを指すようにする必要があります。上記の私のjsFiddleを参照してください。また、Catのコンストラクターから基本コンストラクター(Mammal)を呼び出していません。継承の最小要件に関するチュートリアルについては、http://js-bits.blogspot.com/2010/08/javascript-inheritance-done-right.htmlを参照してください。

静的プロパティが役立つ場合の良い例は、オブジェクトがインスタンス化された回数を追跡する必要がある場合です。インスタンスレベルでそれを行うことはできません。

function Tracker() {
   this.constructor.count++;
}

Tracker.count = 0;

Tracker.getCount = function() {
     return Tracker.count;
}
于 2012-04-04T17:44:11.423 に答える
0

わかりやすくするために、CatクラスをAnimalに変更しました。

Animalのプロトタイプに追加されたものはすべて、Animalの新しいインスタンスに適用されます。呼び出されると、キーワードthisはインスタンスを参照します。

var cat = new Animal();
cat.display(); // calls Animal.prototype.display(), 'this' points to 'cat'

動物に直接接続されているものはありません。直接アクセスすることしかできません。

Animal.display(); // 'this' points to 'Animal'
于 2012-04-04T17:38:06.687 に答える