5

我試圖讓一個JavaScript對象使用另一個對象構造函數的「this」賦值,並假設所有對象的原型功能。這裏就是我試圖完成的例子:使用「this =」的Javascript函數給出了「賦值中無效的左側」

/* The base - contains assignments to 'this', and prototype functions 
    */ 
function ObjX(a,b) { 
    this.$a = a; 
    this.$b = b; 
} 

ObjX.prototype.getB() { 
    return this.$b; 
} 

function ObjY(a,b,c) { 
    // here's what I'm thinking should work: 
    this = ObjX(a, b * 12); 
    /* and by 'work' I mean ObjY should have the following properties: 
    * ObjY.$a == a, ObjY.$b == b * 12, 
    * and ObjY.getB == ObjX.prototype.getB 
    * ... unfortunately I get the error: 
    *  Uncaught ReferenceError: Invalid left-hand side in assignment 
    */ 

    this.$c = c; // just to further distinguish ObjY from ObjX. 
} 

我會就如何有ObjY歸入物objx的任務,以「這個」你的想法感激(即不必重複所有this.$* = *分配中ObjY的構造函數)並且ObjY假定ObjX.prototype。

我首先想到的是嘗試以下操作:

function ObjY(a,b,c) { 
    this.prototype = new ObjX(a,b*12); 
} 

理想我想了解如何在原型的方式做到這一點(即沒有使用任何的「經典」 OOP代用品像Base2)。

值得注意的是,ObjY將是匿名的(例如factory['ObjX'] = function(a,b,c) { this = ObjX(a,b*12); ... }) - 如果我擁有正確的術語。

謝謝。

+1

相關:[?爲什麼我不能指定一個新值「本」的原型函數(HTTP:// stackoverflow.com/q/9713323/1048572) – Bergi 2014-11-15 20:36:29

回答

15

你不能這樣做,因爲this定義的值是不可變的,你不能以那種方式改變它所引用的內容。

一種解決方法是使用了callapply方法中的ObjYthis對象運行ObjX構造函數:

function ObjY(a,b,c) { 
    ObjX.call(this, a, b * 12); 
    this.$c = c; 
} 

在上面的例子中,執行ObjX函數改變其this值,因此您在此函數中對該對象所做的所有屬性擴展都將反映在this值在ObjY構造函數中引用的新對象中。

一旦call方法結束,this對象將被增強,您可以創建更多屬性擴展,如添加$c值。

編輯:關於原型,您的樣品將無法正常工作,因爲prototype酒店在立場對象沒有特殊的意義將是就像任何其他財產,應該在構造函數使用。

我想你可能會混淆構造函數的prototype屬性與所有對象具有的內部[[Prototype]]屬性。

[[Prototype]]財產只能由new操作(通過[[Construct]]內部操作)來設定,這個屬性不能改變的,(雖然有些實現,如Mozilla的一個,你可以通過obj.__proto__;訪問,並在ECMAScript 5,Object.getPrototypeOf方法已經被引入,但我不建議你直接混淆它)。

實際上,當您的構造函數被執行時,this值引用的對象的內部[[Prototype]]屬性已被設置爲其構造函數的prototype屬性。

所以,作爲@Anurag評論,你可以設置ObjY.prototype到新創建的ObjX對象:

function ObjY(a,b,c) { 
    ObjX.call(this, a, b * 12); 
    this.$c = c; 
} 

ObjY.prototype = new ObjX(); 
ObjY.prototype.constructor = ObjY; 

這將使你的ObjY也繼承的屬性添加到ObjX.prototype,正如你看到的,我更改了ObjY.prototype.constructor,因爲上面一行中的分配將使該屬性錯誤地指向ObjX

推薦的文章:

+1

謝謝CMS。偉大的聯繫,也是。另一個問題是如何分配原型 - 可以從構造函數中完成嗎? – 2010-03-12 05:02:36

+0

@Brian,不客氣,是的,我有一個錯字! – CMS 2010-03-12 05:06:14

+0

@Brian,將ObjX的對象設置爲ObjY的原型,以獲得它的方法。 'ObjY.prototype = new ObjX;'。如果在當前對象中找不到方法和屬性,則在原型鏈中查找。 – Anurag 2010-03-12 05:10:36

相關問題