2012-10-09 26 views
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」作爲輸出,但事情是這樣的: 「的翻譯:」這段JavaScript繼承的代碼有什麼問題?

回答

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()); 

OR

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()); 
0

嘗試字符串傳遞到您和功能,如你想的那一刻將整數連接成一個字符串var a =new and("1","2");

0

它應該是這樣的

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

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

你不重寫toString方法,因爲條件的構造不會被調用!嘗試這樣做;

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

好了,所以這裏的問題是你是混合兩種遺傳模式(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() { }; 

Yhen你必須選擇這兩種模式中的一種,不能同時·

我已經固定在這個小提琴代碼:http://jsfiddle.net/dz6Ch/