2015-04-04 61 views
4

我一直在閱讀關於Mozilla開發者網絡的Inheritance and the prototype chain,並一直在想它所說的話。使用Object.create擴展原生JavaScript對象

經常使用的一個錯誤特性是擴展Object.prototype或其他內置原型之一。

我明白爲什麼添加一個新的函數到本地對象的原型會導致問題。

Array.prototype.first = function() { return this[0]; }; 

但是假設有人創建了一個新的數組,並希望它通過其原型鏈有Array所有功能,並且他們做了這樣的事情:

function MyArray() { Array.apply(this, arguments); } 
MyArray.prototype = Object.create(Array.prototype); 
MyArray.prototype.first = function() { return this[0]; }; 

是延長這個方法(繼承從)本地對象也被認爲是不好的做法?如果是這樣,它會造成什麼問題?

+0

http://perfectionkills.com/how-ecmascript-5-still-does-not-allow-to-subclass-an-array/ – Bergi 2015-12-09 12:29:54

回答

1

這是一個通用的軟件體系結構問題,所以對於什麼是對或錯有很多不同的觀點。

我認爲原生對象應該保持原生對象。如果我是一個局外人正在修改一個本地對象的代碼庫,我會很困惑。我可以成爲一名JavaScript大師,但我一開始會迷迷糊糊。

做一個完全相同的事情的一個更好的方法是,而不是通過繼承延伸,以擴大組成。

function ListClass() { 
    var arr = []; 
    return { 
    first: function() { return arr[0]; }, 
    get: function(i) { return arr[i]; }, 
    push: arr.push 
    }; 
} 

您的想法是完全有效的javascript。唯一的反對意見是代碼清晰。

+0

Object.create的缺乏清晰性同樣適用於本機和非本機 - 本體對象。我也不喜歡它,但是顯着的不同之處在於,原型鏈允許使用'MyArray.length',而組合需要重新實現或者暴露組合屬性以獲得'length'。 – Wio 2015-04-04 04:52:26