2010-05-30 108 views
13

Douglas Crockford似乎很喜歡下面的繼承方法:JavaScript的繼承

if (typeof Object.create !== 'function') { 
    Object.create = function (o) { 
     function F() {} 
     F.prototype = o; 
     return new F(); 
    }; 
} 
newObject = Object.create(oldObject); 

它看起來OK我的,但它是如何從約翰Resig的simple inheritance的做法有什麼不同?

基本上它下降到

newObject = Object.create(oldObject); 

newObject = Object.extend(); 

而我感興趣的理論。明智的實施似乎沒有太大的區別。

+0

我也喜歡Object.create()技術。我在我的博客上討論它:http://ncombo.wordpress.com/2013/07/11/javascript-inheritance-done-right/ – Jon 2013-07-11 13:51:52

回答

7

的方法完全不同,Resig的技術創建構造函數,這種方式也被稱爲經典的繼承即:

var Person = Class.extend({ 
    init: function(isDancing){ 
    this.dancing = isDancing; 
    } 
}); 

var p = new Person(true); 

正如你看到的,Person對象實際上是一個constructor function,這是與new運營商一起使用。

隨着Object.create技術中,繼承是基於情況下,當對象與其他對象直接繼承,這也被稱爲原型繼承差分繼承

+0

只是感興趣,你對Crockford的方法有什麼看法?我永遠不能理解無構造器實例的吸引力...... – James 2010-05-30 15:16:17

+0

@JP:我真的很喜歡['Object.create'](https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Object/創建)它使原型繼承非常簡單,並且可以用它構建真正聰明的創建模式,現在使用ECMAScript第5版,符合標準的方法可以使用屬性描述符...非常強大... – CMS 2010-05-30 15:21:12

+1

那麼,爲什麼要一個使用一個在另一個?我需要建立一個系統並利用一些聰明的繼承,但我沒有看到任何理由選擇另一個。 – Tower 2010-05-30 15:29:23

6

它們完全不同。

Douglas Crockford的方法創建了一個實例,它繼承了一個不同的實例。

John Resig的方法創建了一個,它繼承了一個不同的類。

當使用Douglas Crockford的方法時,您正在創建一個新的對象實例,它繼承了一個現有的實例。

當使用John Resig的方法時,您將創建一個構造函數,然後您可以使用該構造函數創建繼承類的實例。