2013-12-23 59 views
1

我從一個BaseDerived類繼承這樣的原型:設置__proto__一個構造函數

Base is ViewDerived is ItemVIew

function ItemView(){ 
View.call(this); 
} 

ItemView.prototype.__proto__ = View.prototype 

可以在上述可與正好

Iteview.prototype = new View; 
來達到的

另外我還有一個問題

當我設置ItemView.prototype.__proto__ = View.prototypeItemView原型是Function.prototype ,這意味着我設置Function.prototype.__proto__ = View.prototype 所以View.prototype所有方法都是由所有其他構造函數定義我繼承?

我可以通過ItemView.__proto__ = View.prototype解決嗎?

這是擴展一個基類像視圖,以便ItemView仍然是一個構造函數的reccomended方式?

+0

原型的_proto是一個對象或它的構造函數。你在實例上使用_proto,在構造函數上使用.prototype。它與instance.constructor.prototype基本相同。 – dandavis

回答

4

ItemView.prototype引用的對象是指定爲通過new ItemView創建的對象的基礎原型。 ItemView.prototype.__proto__很可能(在具有它的實現中)爲Object.prototype

但是不,你不想做ItemView.prototype = new View(); - 如果View需要參數?這是一個非常常見的錯誤。

取而代之的是,在預ES5環境:

function Temp() { 
} 
Temp.prototype = View.prototype; 
ItemView.prototype = new Temp(); 
ItemView.prototype.constructor = ItemView; 

在ES5環境:

ItemView.prototype = Object.create(View.prototype); 
ItemView.prototype.constructor = ItemView; 

...,繼續你的View.call(this)從內部ItemView做。

+0

需要什麼ItemView.prototype.constructor = View? –

+1

@RanaDeep:純粹的約定。這就是JavaScript函數默認的'prototype'對象的設置,所以我們確保我們做同樣的事情。這有點奇怪:[規範說它創建了這個屬性](http://www.ecma-international.org/ecma-262/5.1/#sec-13.2)(步驟17),這讓你覺得它是重要;但它實際上並不使用*屬性來表示任何內容。 (例如,它不會與'instanceof'一起使用。)模仿默認引擎的功能非常便宜,所以我總是這麼做。 –

+0

@RanaDeep:順便說一句,你可能會發現我的繼承層次結構([Lineage'](http://code.google.com/p/lineagejs/)的助手腳本),如果不是腳本本身,可能只是用於[此文檔頁面](http://code.google.com/p/lineagejs/wiki/ComparisonWithPlainJavaScript)顯示使用它而不使用它(例如,沒有幫助者做同樣的事情)。 –

相關問題