1
function condition(){ 
  this.expression = ""; 
  this.toString = function(){
    return this.expression;
  }
};

function and(first, second){
    this.expression = first + " and " + second;
}

function nop(){};
nop.prototype = condition.prototype;

and.prototype = new nop();

var a =new and(1,2);

console.log(a.toString());

「1と2」が出力として表示されることが期待されますが、これが発生したことです:「[オブジェクトオブジェクト]」

4

5 に答える 5

1

conditionのプロトタイプをのプロトタイプに転送していnopます。問題はcondition.toString、プロトタイプで宣言されていないことです...ここで:

function condition(){ 
  this.expression = ""; 

};
  condition.prototype.toString = function(){
    return this.expression;
  }
function and(first, second){
    this.expression = first + " and " + second;
}

function nop(){};
nop.prototype = condition.prototype;

and.prototype = new nop();

var a =new and(1,2);

console.log(a.toString());

また

function condition(){ 
  this.expression = ""; 
  this.toString = function(){
    return this.expression;
  }
};

function and(first, second){
    this.expression = first + " and " + second;
}

function nop(){};
nop = condition;

and.prototype = new nop();

var a =new and(1,2);

console.log(a.toString());
于 2012-10-09T09:40:52.860 に答える
1

条件のコンストラクターが呼び出されることはないため、toStringメソッドをオーバーライドすることはありません。これを試してみてください。

condition.prototype.toString=function(){
    return this.expression;
}
于 2012-10-09T09:43:00.503 に答える
0

整数を文字列に連結しようとしているので、文字列をand関数に渡してみてください var a =new and("1","2");

于 2012-10-09T09:40:52.407 に答える
0

こんな感じになります

function condition(){ 
  this.expression = ""; 
};    

condition.prototype.toString = function(){
   return this.expression;
}
于 2012-10-09T09:41:11.263 に答える
0

さて、ここでの問題は、2つの継承パターン(http://davidshariff.com/blog/javascript-inheritance-patterns/)を疑似クラシックと機能パターンで混合していることです。

コンストラクター関数にメソッドを追加することにより、オブジェクトを作成できます。

function MyClass() {
    var privateProperty = 1;
    this.publicProperty = 2;

    function pivateMethod() {
        // some code ...
    }

    this.publicMethod = function() {
        // some code ...
    };
}

// inheritance
function SubClass() {
    MyClass.call(this);

    this.newMethod = function() { };
}

ここで、このクラスのインスタンスを作成すると、すべてのメソッドが再度作成されます。

次に、プロトタイプパターンがあります。

function MyClass() {
    this._protectedProperty = 1;
    this.publicProperty = 2;
}
MyClass.prototype._protectedMethod = function() {
    // some code ...
};
MyClass.prototype.publicMethod = function() {
    // some code ...
};

// inheritance
function SubClass() {
    MyClass.call(this);
}
SubClass.prototype = new MyClass();
SubClass.prototype.newMethod = function() { };

// OR
function SubClass() {
    MyClass.call(this);
}

function dummy() { }
dummy.prototype = MyClass.prototype;
SubClass.prototype = new dummy();
SubClass.prototype.newMethod = function() { };

両方ではなく、これら2つのパターンのいずれかを選択する必要があります。

このフィドルのコードを修正しました:http://jsfiddle.net/dz6Ch/

于 2012-10-09T09:47:07.453 に答える