1

私はJSの初心者であり、次のコードを機能させようとしていますが、期待した結果が得られません。

cat = function(name) {
    this.name = name;
    this.talk = function() {
        alert("Cat "+name+" says meow.");
    }
}
cat1 = new cat("George");
cat1.talk();

cat.prototype.changeName = function(name) {
    this.name = name;
}
cat2 = new cat("Felix");
cat2.changeName("Bill");
cat2.talk();

私がJSについて読んだことから、2番目のアラートから取得する必要があります"Bill says meow"。しかし、プロパティが設定されていないようで、私はまだ取得しています"Felix says meow."

誰かが間違いを指摘できますか?本当に助かります。前もって感謝します。

4

3 に答える 3

2

それは継承の問題ではなく、適切な変数にアクセスすることの問題です。コンストラクターを見てください。

cat = function(name) {
    this.name = name;
    this.talk = function() {
        alert("Cat "+name+" says meow.");
    }
}

具体的にはalert("Cat "+name+" says meow.");。コンストラクターに渡した引数を常に参照しnameますメソッドが新しい値に設定されるthis.nameため、代わりにアクセスする必要があります。changeNamethis.name

ただし、コンストラクター内でこのメソッドを定義する理由はありません。プロトタイプにも追加してください。

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

Cat.prototype.talk = function() {
    alert("Cat " + this.name + " says meow.");
}
于 2013-01-21T11:21:39.433 に答える
1

継承を使用していません。コードからどこに必要かわかりません。

まず第一に、あなたの「トーク」関数はこのnameプロパティにアクセスする必要があります。そうではありません。

Cat = function(name) {
    this.name = name;
    this.talk = function() {
        alert("Cat "+this.name+" says meow."); //needs the to access this' name property
    }
}

次へ:インスタンスが作成されるたびにtalkメソッドを再宣言する必要はありません。

Cat.prototype.talk = function(){
    ...
}

継承が必要な場合は、それを実現できます。

var MainCoon = function(name){
    this.name = name;
}
MainCoon.prototype = new Cat();
MainCoon.prototype.be6ftTall = function(){

}
于 2013-01-21T11:21:58.823 に答える
1

これを参照すると、関数catのインスタンスが参照されるため、this.nameはcatのインスタンスのnameの値になります。名前の参照(これなし)は、コンストラクターの後のcatの関数の名前を指します。これを読んだ後、あなたはより多くの洞察を得ることができると思います:

https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Inheritance_Revisited

ページの下部に次のリンクがあります。クロージャに関する部分に到達すると、name変数とthis.name変数のスコープを理解できるかもしれません。

また、JavaScriptはクラスベースの言語ではありませんが、(一部の人によると実装が不十分な)プロトタイプ言語です。

http://www.lshift.net/blog/2006/07/24/subclassing-in-javascript-part-1

子クラスが親を「サブクラス化」する場合、またはより適切に言うと、childFunctionがプロトタイプとしてparentFunctionを使用する場合、この例が示すように、chidFunction「インスタンス」はその親の遅延コピーを共有することに注意してください。

var parent,child,bill,suzan;
parent=function(){
    this.name="parent";
    this.array=[];
}
child=function(){
}
child.prototype=new parent();
bill=new child();
bill.name="bill";
suzan=new child();
suzan.name="suzan";
suzan.array.push("done in suzan");
console.log(suzan.name);//correct is suzan
console.log(bill.name);//correct is bill
console.log(bill.array);//incorrect, shows ["done in suzan"]

「子」を次のように変更することで、これを修正できます。

child=function(){
    parent.call(this);
}

ただし、これは、オブジェクトプロパティ(関数を除く)がthisを使用して親関数本体で宣言されている場合にのみ機能します。プロトタイプの代わりに構文。

于 2013-01-21T11:34:08.943 に答える