2012-08-04 71 views
0

我對Crockford推薦的繼承存在困惑,Crockford方法和通用(默認)方法之間的主要區別是什麼。Javascript基本繼承vs Crockford原型繼承

//Crockford method 
     function object(o) { 
      function F() {} 
      F.prototype = o; 
      return new F(); 
     } 

以下是更通用的方法

function Base(name) { 
    this.name = name; 
} 

Base.prototype.getName = function() { 
    return 'Base :' + this.name; 
} 

function Child(name) { 
    this.name = name; 
} 

Child.prototype.getName = function() { 
    return 'Child :' + this.name; 
} 

function Kid(name) { 
    this.name = name; 
} 

Kid.prototype.getName = function() { 
    return 'Kid :' + this.name; 
} 

Child.prototype = new Base ("childBase"); 
Kid.prototype = new Child ("kidChild"); 

var base = new Base ("myBase"); 
var child = new Child("myChild"); 
var kid = new Kid("myKid"); 

console.log(base.getName()); 
console.log(child.getName()); 
console.log(kid.getName()); 

是什麼介於兩者之間的區別?

其實我不能完全理解克羅克福德方法。任何人都可以幫助我找出克羅克福德方法中通用方法和優點的缺點。

+1

你真的看了看輸出嗎?它不應該是你期望的,因爲在你已經爲它們分配了函數('getName')之後,你重寫了原型。 – 2012-08-04 23:08:56

+0

看看[這個答案](http://stackoverflow.com/a/1598077/1048572) – Bergi 2012-08-04 23:23:32

+1

@EliasVanOotegem:我會說一個構造函數(用於'new'關鍵字)*確實創建*繼承鏈... – Bergi 2012-08-04 23:24:51

回答

1
Child.prototype = new Base ("childBase"); 
Kid.prototype = new Child ("K1", "K2"); 

用這些行你實例化兩個對象,它們甚至有自己的名字。這有什麼好處?在更復雜的環境中,這甚至可能會破壞應用程序 - 當構造函數使用私有變量和特權方法時,其所有子元素將在同一個實例中共享相同的變量!

因此,一般不應該使用這種方式,而是使用Crockfords功能,舊版本Object.create。它將與Base.prototype一起被調用,創建一個新的對象,直接從這個對象繼承 - 它只設置原型鏈,但不執行任何構造器代碼。 Understanding Crockford's Object.create shim將幫助您瞭解詳情。然後創建的對象完美地成爲兒童的原型對象。另請參閱this answer