JavaScript是一種基於原型的語言。 這意味着它不像其他語言那樣使用類關鍵字。相反,JavaScript使用函數作爲類。
在您的示例數據變量可以被同化到類:
var Data = function() { ... }
要創建這個類的一個實例,我們使用新關鍵字指定類型的對象的結果到一個變量。
var data = new Data()
由於ECMA腳本6我們可以使用實例化方法Object.create()
創造具有指定原型對象和屬性的外行對象。它需要將這個對象作爲新創建對象的原型。 (這也拷貝構造函數)
所以下面的線是一種方法,使元數據擴展後端對象,並保持自己的構造:
// Metadata extends Backend
Metadata.prototype = Object.create(Backend.prototype);
Metadata.prototype.constructor = Metadata;
但是這個代碼不完全等同於Metadata.prototype = new Backend();
。看到這個例子:
//Base class
var Backend = function(){ this.publicProperty='SomeValue'; }
//Extension class 1
var Metadata1 = function() { }
Metadata1.prototype = Object.create(Backend.prototype);
Metadata1.prototype.constructor = Metadata1;
//Extension class 2
var Metadata2 = function() { }
Metadata2.prototype = new Backend();
/*
* Then the results are different (see code snippet at the end of this post)
*/
//result1 = 'undefined'
var data1 = new Metadata1();
var result1 = data1.publicProperty;
//result2 = 'SomeValue'
var data2 = new Metadata2();
var result2 = data2.publicProperty;
其實都是非常相似,主要區別是new
關鍵字實際運行構造函數代碼,而Object.create
將不會執行代碼。
另外一個區別是,使用Object.create
可以創建一個不會從任何東西繼承的對象(Object.create(null)
)。
如果你Metadata.prototype = null
而新創建的對象將從Object.prototype
注意繼承:在一些較老的瀏覽器(IE8及以下),可以使用該等效代碼Object.create
:
Object.create = function(o){
function F(){}
F.prototype=o;
return new F();
}
以下是顯示兩種方法之間差異的工作代碼片段
//Base class
var Backend = function(){ this.publicProperty='SomeValue'; }
//Extension class 1
var Metadata1 = function() { }
Metadata1.prototype = Object.create(Backend.prototype);
Metadata1.prototype.constructor = Metadata1;
//Extension class 2
var Metadata2 = function() { }
Metadata2.prototype = new Backend();
//result: 'undefined'
var data1 = new Metadata1();
$("#result1").text("result1: " + (typeof data1.publicProperty=='undefined' ? 'undefined' : data1.publicProperty));
//result: 'SomeValue'
var data2 = new Metadata2();
$("#result2").text("result2: " + (typeof data2.publicProperty=='undefined' ? 'undefined' : data2.publicProperty));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="result1"></div>
<div id="result2"></div>
謝謝。這非常令人困惑,我非常高興** ES6繼承語義(「擴展」,構造函數,「超級」)更容易理解。 –