2012-11-15 59 views
1

我感覺有點遺憾,但有些東西我不明白(甚至不知道是否有可能)關於JavaScript中的原型設計。
我想使用的方法,而我創造我的僞類的原型:參考創建原型時的方法

var Class = function() {} 
Class.prototype = { 
    a: function() { 
     return 'ok' 
    } 
    , z: Class.prototype.a() // I tried with `this`/`constructor`/etc. 
} // TypeError: Object [object Object] has no method 'a' the rest isn't evaluated 
var test = new Class() 
test.z 

我知道我能做到這樣,但我想知道如果我能,但仍我在Class.prototype聲明中的所有方法/屬性:

var Class = function() {} 
Class.prototype.a = function() { 
    return 'ok' 
} 
Class.prototype.z = Class.prototype.a() 
var test = new Class() 
test.z // "ok" 

謝謝。

回答

2

不,你不能。就像你不能定義它們已經結束語句之前引用任何對象屬性:

var x = { 
    y: 10, 
    z: x.y + 5 // TypeError, cannot read property `y` of undefined 
}; 

變量x沒有一個值(它聲明,因爲聲明懸掛,但它的價值是undefined),直到已經評估完整的賦值表達式。

+0

無賴,但感謝。 – Calvein

1

是的,你可以。您可以指定Class這樣的:

var Class = function() { 
if (!Class.prototype.a){ 
    var proto = Class.prototype; 
    proto.a = function() { 
    return 'ok'; 
    }; 
    proto.z = proto.a(); 
} 
} 

var test = new Class; 
console.log(test.z); //=> "ok" 

另一個選擇可能是使用單創建原型屬性/方法:

var Class = function(){}; 
Class.prototype = function(){ 
    function a(){return 'ok';} 
    return {a: a, z: a()}; 
}(); 
var test = new Class; 
console.log(test.z); //=> "ok" 
1

如果你只有一個附加屬性添加,你可以做這樣的:

(Class.prototype = { 
    a: function() { 
     return 'ok' 
    } 
}).z = Class.prototype.a(); 

或者你也可以採取這種方法,它使用一個anonymou s作爲臨時構造函數:

Class.prototype = new function() { 
    this.a = function() { 
     return 'ok' 
    } 
    this.z = this.a() 
} 
0

第一:接受的答案是錯誤的。您可以。

第二:有沒有見過以下模式?如果你想訪問使用this當前對象

Class.prototype = { 
    constructor: Class 
}; 

constructor屬性是必要的。

第三:如果您不在屬性函數中,則上下文爲window(嚴格模式下爲undefined),而不是對象。

四:這是你在找什麼:

function Class() {} 

Class.prototype = { 
    constructor: Class, // required! 

    a: function() { 
     return 'ok'; 
    }, 

    z: function() { 
     // 'this' is the object *in* the function 
     return this.a(); 
    } 
}; 

var o = new Class(); 
console.log(o.z()); // "ok" 
+0

我同意所選的答案是錯誤的。儘管如此,你的解決方案不會顯示'ok',因爲'z'方法不會返回任何內容,也不是OP所要求的。 – KooiInc

+0

@KooiInc修復了返回。 –