10
這是可能的嗎?JavaScript:基於原型創建對象而不使用新建+構造函數
我的想法:原型本質上是構造函數的功能(無論是原生的構造函數,如函數,字符串還是對象,還是您自己的自定義構造函數),只有'new'關鍵字能夠利用構造函數及其原型創建對象
我錯過了什麼嗎?
這是可能的嗎?JavaScript:基於原型創建對象而不使用新建+構造函數
我的想法:原型本質上是構造函數的功能(無論是原生的構造函數,如函數,字符串還是對象,還是您自己的自定義構造函數),只有'new'關鍵字能夠利用構造函數及其原型創建對象
我錯過了什麼嗎?
你是對的,但現在在ECMAScript的第5版,該Object.create
方法能夠創建使用其他對象作爲原型對象的實例:
var proto = {foo: 1};
var obj = Object.create(proto);
在上面的例子中,obj
將被創建,它將包含[[Prototype]]
內部屬性爲proto
參考,並:
obj.foo; // 1
obj.hasOwnProperty('foo'); // false
這種方法是從批准的2009年12月新的規範,據我現在已經看到的是AVA適用於Mozilla JavaScript 1.9.3實施。
現在你可以通過這種模仿法的行爲,提出Douglas Crockford:
if (typeof Object.create !== 'function') {
Object.create = function (o) {
function F() {}
F.prototype = o;
return new F();
};
}
康福德曾提出的「生出」一個稍微更高效的版本(順便說一句,最初由拉塞·尼爾森所提到的,不Crockford),其中「dummy」函數(在你的例子中爲'F')被存儲在閉包中,然後被重用。這使得更多的內存(和運行時)有效的實現。另請注意,Crockford的Object.create仿真幾乎不符合ES5(不支持第二個參數,沒有第一個參數的類型檢查來拋出TypeError,如果它不是對象等)。謹慎使用;) – kangax
你是一個拯救生命的人。我一整天都在爲網絡搜索這個想法。 –