2017-07-21 64 views
1
調用繼承父類的方法時,返回正確的子類型

比方說,我有這樣的父類Vector2定義如下:在JavaScript

function Vector2 (x, y) { 
    this.x = x; 
    this.y = y; 
} 
Vector2.prototype.add = function(vec) { 
    console.log(Reflect.getPrototypeOf(this)); 
    if (vec instanceof Vector2) 
    return new Vector2(this.x + vec.x, this.y + vec.y); 
    throw "This operation can only be performed on another Vector2. Recieved " + typeof vec; 
}; 

Vector2擴展名爲Size應該繼承的所有功能善其父,分別參考xy作爲wh,像這樣的aditional的能力:

function Size(x,y) { 
    this.x = x; 
    this.y = y; 
} 
Size.prototype = new Vector2; 
Size.prototype.constructor = Size; 
Size.prototype._super = Vector2.prototype; 
Object.defineProperties(Size.prototype, { 
    'w': { 
    get: function() { 
     return this.x; 
    }, 
    set: function(w) { 
     this.x = w; 
    } 
    }, 
    'h': { 
    get: function() { 
     return this.y; 
    }, 
    set: function(h) { 
     this.y = h; 
    } 
    } 
}); 

最後,我有一個代碼片段,創建了Size兩個新實例,並將它們相加,並嘗試從w財產,像這樣寫着:

var s1 = new Size(2, 4); 
var s2 = new Size(3, 7); 
var s3 = s1.add(s2); 
console.log(s3.w); 
// 'undefined' because s3 is an instance Vector2, not Size 

如何修改Vector2add方法來創建新實例不管當前類是不是泛型?

回答

2

您的吸氣劑代碼中有一個錯誤:代替self,您需要使用this

然後就可以調用正確的構造函數:

return new this.constructor(this.x + vec.x, this.y + vec.y); 

注意:您還可以使用vec.constructor,這一切都取決於你想,當你添加一個尺寸對象Vector對象發生什麼。我認爲源對象(應用add方法)確定返回對象的類似乎更直觀。如果您覺得添加的對象應該確定返回的對象的類,則使用vec而不是this

+1

最近做了太多的python。大聲笑 –

+0

好你拒絕它。我只是測試和學到了一些東西。我爲我的無知道歉。 –

+0

沒問題。 ;-) – trincot

2

我相信這可能是你要找的。

return new vec.constructor(this.x + vec.x, this.y + vec.y);

使用的什麼被傳遞給添加方法來創建返回的對象constructor

您還錯誤地將this傳遞給您的new Vector2(this, ...)