2013-10-27 103 views
1

我有這樣的代碼:原型繼承理解

而且我有一個qustion:Class.prototype.method = function(){ // open method

當我們寫這樣的,我們說,我們班的那個原型都會有這樣的方法。 所以他的子類將有這種方法。 但我不能理解的是, 爲什麼我們不能只寫

Class.method = function() 
+1

即語法把類爲普通功能對象,而不是作爲類對象實例的構造函數。 – 2013-10-27 19:58:22

+0

@Jeffman - 請說清楚。你指的是什麼(指的是)? – ncm

+0

你在問什麼?你在說什麼是使用'classname.prototype.methodname'的原因,爲什麼我們不使用'classname.methodname'? – ncm

回答

1

Class.method = function() {};

這隻會在構造函數Class添加method屬性。函數是對象,可以像其他任何對象一樣保存數據。但是,不會將method函數添加到Class實例的原因很簡單:這不是在JavaScript中如何實現原型繼承的原因

您應該閱讀What is the 'new' keyword in JavaScript?,您將瞭解如何設置原型鏈,以及爲什麼向構造函數添加成員不會影響使用此構造函數創建的實例。

我認爲值得一提的是,ClassSub.prototype = new Class();不是建立原型鏈的有效方式,因爲它將運行Class構造函數的代碼。

在現代瀏覽器中,您可以簡單地使用Object.create,並且舊版瀏覽器有墊片。

ClassSub.prototype = Object.create(Class.prototype);

+0

我已閱讀過關於它的答案,謝謝你......我想我需要一些時間來理解它......)) – user2114177

0

正如評論所說,Class.method會爲變量Class的屬性。不是實例Class

var Class = function() { /* some code */ } 
Class.method = function() { } 
console.log(Class.method); // function() { } 
console.log(new Class().method); // undefined 

Class.prototype.method = function() { } 
console.log(new Class().method); // function() { }