2011-07-07 25 views
2

下面的代碼並不像我想的那樣產生原型。任何人都可以看到我做錯了什麼?我在JavaScript中做了這個原型的錯誤,有什麼想法?

var A = function() { 
    return { 
     workingTest: function() {return "OK";} 
    }; 
}; 

A.prototype.notWorkingTest = function() {return "Not so much";}; 

var a = new A(); 

a.workingTest(); // "OK" 
a.notWorkingTest(); // TypeError: "undefined_method" 

任何想法?我認爲這是擴展JS類的正確方法,但我錯過了一些東西。

+0

如果你做'console.log(a.prototype)',你會得到什麼? –

回答

4

變遷到

var A = function() { 
    this.workingTest = function() {return "OK";}; 
}; 

的問題是,你原來A函數創建並返回的Object直接實例,而不是使用由new運營商和綁定創建thisA實例。

要理解這一點,嘗試運行

var B = function() { return { x: 42 }; } 
var C = function() { this.x = 42; } 
var b = new B; 
var c = new C; 
alert("b.constructor === B : " + (b.constructor === B)); // false 
alert("b.constructor === Object : " + (b.constructor === Object)); // true 
alert("c.constructor === C : " + (c.constructor === C)); // true 

是因爲B返回一個新的對象,則返回值不再是一個instanceof B並且不使用B的原型。

+0

這解決了它。先生,你是當天的英雄! –

0

因爲A返回一個單獨的對象,所以a不是A類的實例;相反,它是一個普通的對象,恰好由A函數返回。
根本不連接到A或其prototype

相反,你需要分配給workingTestthis構造函數中,並沒有返回任何東西:

var A = function() { 
    this.workingTest = function() { return "OK"; }; 
}; 
0

因爲你延長A的原型,而new A()返回一個‘匿名’的對象。

0

在現代瀏覽器,可以讓你的有趣的原型方法有:

var A = { 
    workingTest: function() {return "OK";} 
}; 
A.notWorkingTest = function() {return "Yes it does";}; 

var a = Object.create (A); 
a.workingTest(); // "OK" 
a.notWorkingTest(); // "Yes it does" 

a.extending = function() {return "extended";}; 
var b = Object.create(a); 
b.workingTest(); // "OK" 
b.extending(); // "extended" 

這工作根據ES5規範。

0

您將A定義爲返回對象文字的函數。調用函數時使用new關鍵字意味着它是一種特殊類型的函數,即構造函數。 JavaScript中的構造函數必須以特定的方式編寫,使用關鍵字this來設置屬性。

var A = function() { 
    this.workingTest = function() {return "OK";}; 
}; 
相關問題