2011-05-27 25 views
2

我問的問題:在javascript中,「原型屬於類而非實例」是什麼意思?

Why cant I declare a constructor instantiate an object and then access the prototype?

你可以看到,我已經打上了答案。我理解的反應,但林有點困惑,他的意思是:

The prototype belongs to the class, not the instance: 

這是否意味着JavaScript在這個例子中有一個類?我認爲JavaScript是無階級的?它只有函數構造函數...函數構造函數在什麼時候成爲一個類?是否使用.prototype訪問器向其添加其他成員?

回答

3

其實class是一個OOP術語,不是真正的JavaScript。這意味着原型屬於constructor。因此,在

function MyConstructor(prop){ 
    this.foo = prop || 'foo'; 
} 
MyConstructor.prototype.bar = 'allways bar'; 
var mc1 = new MyConstructor('I am mc1'), 
    mc2 = new MyConstructor('I am mc2'); 

alert(mc1.bar) ; //=> allways bar 
alert(mc2.bar) ; //=> allways bar 
alert(mc1.foo) ; //=> I am mc1 
alert(mc2.foo) ; //=> I am mc2 

bar屬於構造函數(MyConstructor)的原型。對於每一個例子,它總是會是'allways bar'。 foo是一個實例屬性(默認值爲「foo」),可以爲每個實例分配一個不同的值。

+0

你好,請問有什麼this.foo =道具|| 「富」;」手段?那是一個OR符號嗎? – Exitos 2011-05-27 13:42:24

+1

嗨Pete2k,是的是一個OR符號。它是簡寫:如果'prop'評估爲undefined(或null),則將值「foo」賦值給'this.prop'。它通常用於確保某些變量獲得(默認)值。 – KooiInc 2011-05-27 15:31:48

0

JavaScript中沒有類。

構造函數是函數並具有原型引用對象的屬性。您可以添加功能到該對象,或指定一個新的對象原型屬性創建一個繼承鏈:

function MyConstructor() { 
    // initialise instance 
} 

MyConstructor.prototype.someMethod = function() { 
    // ... 
    }; 

MyConstructor.prototype.anotherMethod = function() { 
    // ... 
}; 

或與其他構造的實例替換它:

MyConstructor.prototype = new SomeOtherConstructor(); 

MyConstructor.prototype.constructor = MyConstructor; 

等。現在,當MyConstructor的一個實例被創建:

var anInstance = new MyConstructor(); 

由構造返回的對象具有MyConstructor.prototype作爲其內部[[原型]]屬性和「繼承」其方法和屬性(以及那些在其整個[[原型]]鏈)。

所以MyConstructor的每個實例都有其原型鏈的MyConstructor.prototype。但請注意,MyConstructor不會從它自己的原型繼承,它僅由由新建的MyConstructor創建的實例使用。