(容易解釋)使用function
作爲構造(通過使用new
操作)時 的prototype
屬性僅適用。該function
創建克隆的是prototype
和函數內部的this
關鍵字設置爲克隆。克隆上的屬性是直接引用/指向prototypes
屬性的指針。
對象文字{}
是替代new Object()
的更強大的表達式,因此可以從Object.prototype
「繼承」屬性。
所以:
function ClassLike() {}
ClassLike.prototype = {
foo : "bar"
}
var instance = new ClassLike();
alert(instance.foo); // bar
工作,因爲new
操作者在運動中踢一些操作,以創建新的對象,而:
var instance = {
foo : "bar"
}
instance.prototype = {
baz : "foobar"
}
僅僅增加了一個屬性(原型)到已創建的對象,沒有任何過程實際上分配/更改對象原始原型。
現在Mozilla添加了一個非標準(IE不支持它)的方式來改變一個已經實例化的對象原型通過__proto__
,並且有一些請願書將它添加到ES5(EcmaScript 5)中。我不會使用它atm。但它的工作原理是這樣的:
var instance = {};
var parent = {
foo : "bar"
}
instance.__proto__ = parent;
alert(instance.foo); // bar
另一種方式來改變已經實例化對象的原型是添加到Object
構造函數的原型(這是不建議的原因有很多)。因此:
var instance = {}; // a more powerful alternative to `new Object()`
Object.prototype.foo = "bar";
alert(instance.foo); // bar
這都是可能的,儘管羯羊它是明智的,做到這一點...我說沒有,但衆說紛紜,我寧願避免的辯論;)
不管怎麼說,只記得prototype
作品當你new
一function
,否則它只是成爲一個實例的屬性。
謝謝你的回答。我有相對的問題。我需要訪問私有成員的特權函數,對吧?如果是,那麼爲什麼當我調用「new C().fn()」,「this」沒有看到「m」成員「?var C = function(){var m; this.fn = function(){ return this.m;}} – theateist 2011-03-22 10:06:29
'var m'創建一個局部變量,而不是一個屬性,'this.m'試圖引用一個公共屬性,'this'關鍵字和其他語言不一樣,它是隻是一個指向函數擁有對象的'注入'變量,這可以起作用:'var C = function(){var m = 1; this.fn = function(){return m;}}' – BGerrissen 2011-03-22 10:19:14
'__proto__'不會被添加到ES5中:ES5已經是最後一個不變的標準了,但是'Object.getPrototypeOf(o)'給出了'o'的原型,同樣的,現在說「now Mozilla已添加「;它已經存在了很長一段時間,並且也存在於Carakan(Opera),JSC(Safari)和V8(Chrome)中。 – gsnedders 2011-03-22 20:40:24