2012-07-28 61 views
4
var a = function() {}; 
a.prototype.test = function() { 
alert("hello"); 
} 

工作正常,但在下面的代碼需要幫助的JavaScript哎呀

var b = new Object(); 
b.prototype.test = function() { 
alert("hello"); 
} 

我收到此錯誤類型錯誤:無法設置屬性未定義「測試」,我無法得到它。

根據我的理解b繼承了原型對象對象。所以我們應該能夠按照以下方式添加一個新屬性,比如b.prototype.x = 1。

但是對象 .prototype.x = 1作品。

的typeof 對象和賦予功能但乙的是反對

我沒有得到爲什麼b.prototype.x = 1個不起作用

感謝。

回答

2

Object是一個函數,它有一個prototype屬性。

new Object()創建一個對象,該對象不具有prototype屬性。


如果你想設置一個對象的原型,你可能意味着設置對象的構造函數的原型。

b.constructor.prototype.test = ... 

爲了澄清一些原型/構造無義的:

甲函數具有prototype,它是一個對象。它指定要添加到該函數實例的屬性。

一個對象有一個constructor,這是一個函數。它指定用於創建對象的功能。

請注意,函數是一個對象,所以它也有一個constructor,它是Function

0

你應該能夠做到這一點是這樣的:

var b = {}; 
b.test = function() { 
    alert('Hello'); 
}; 
+0

你還沒有回答,爲什麼它不工作的OP有它的方式的問題。 – 2012-07-28 19:49:55

1

您可以參考這個resource

它不會爲新對象的工作,因爲它不具有prototype屬性集。 prototype屬性指向您已繼承的對象。而且,由於new Object()一直沒有對象從繼承,其prototype設置爲undefined

一個function,另一方面,具有超強的對象(它繼承)默認情況下。

2

這是一個棘手的問題 - 有兩種類型的原型字段,一個是內部的,一個是外部的。外部的一個,你可以直接訪問正常的原型領域,就像你在做什麼。內部的一個用於在對象中找不到字段/鍵時執行查找。

如果你做了new blah(),它會創建一個新的對象,其內部原型字段被設置爲外部原型字段blah。默認情況下,新構造對象的外部原型字段爲undefined。特別是,這就是評估b.prototype.x失敗的原因 - 您無法對未定義的值執行字段訪問。如果你希望你可以爲一個新的外部原型創建一個新的對象,例如b = new Object(); b.prototype = {}

你可以看到在這裏的行動內部/外部原型領域:

Object.prototype.x = 4 
b = new Object() 
b.x // returns 4 

什麼事是,B的內部原型場點的Object.prototype,所以查找到B未能被重定向到做一個查詢在Object.prototype中。

我不知道爲什麼,但新創建的功能得到他們的外部原型字段設置爲對象 - 這將導致第一個工作。

+0

沒有第一個工作,因爲一個函數繼承了Object(),還是我誤解了一些東西? – ryuusenshi 2012-07-28 20:10:03

+0

第二個不起作用,因爲b在該點上沒有外部原型字段。我認爲你對第一個工作是正確的,因爲新創建的函數將Object設置爲其外部原型字段。 – bchurchill 2012-07-28 20:11:37

+0

好吧,+1,一個非常好的解釋 – ryuusenshi 2012-07-28 20:12:53