2013-05-20 52 views
6

例如,在Array數據類型有一個名爲pop()功能,我想用增加:爲什麼原生數據類型屬性沒有在其對應的原型上顯示?

Array.prototype.pop = function(){ /* ... */ }; 

但據我所知,使其不可枚舉的唯一方法就是像做這:

Object.defineProperty(Array.prototype, "pop", { enumerable: false }); 

這不是所有的瀏覽器都支持。

Array.prototype.doSomething= function(){ }; 
var arr = []; 

console.log(arr); // [doSomething: function] 

那麼,爲什麼doSomething在這裏顯示出來,而pop()不?他們是不是都添加到原型?

+0

使用數組文字記錄數組:'[elem,elem]'。您如何期望自定義屬性適合這裏? '{0:elem,1:elem,length:2,pop:...}'? –

+0

@ alex23在這個例子中,chrome開發者工具。但通常螢火蟲。我相信它也會出現在那裏。 – Johan

+0

@RobW好吧,如果你看這裏:http:// jsfiddle。net/6BAJx/1 /在Chrome中,你會得到'[1,2,3,doSomething:function]'。我的問題是爲什麼只有我的自定義屬性「適合」,而本機是不可見的。 – Johan

回答

4

MDN說:

一種... in循環不隨非枚舉的屬性進行迭代。從Array和Object等內置構造函數創建的對象繼承了Object.prototype和String.prototype中不可枚舉的非枚舉屬性,如String的indexOf方法或Object的toString方法。循環將迭代對象本身的所有可枚舉屬性,而對象則繼承其構造函數的原型(更接近原型鏈中的對象覆蓋原型的屬性)。

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/for...in

什麼是記錄據說是從for..in..迭代,或類似的到來。

非可枚舉屬性的概念預先指定要在Javascript中指定屬性可枚舉的特性。

MDN說:

的ECMAScript 3有一個名爲DontEnum內部屬性。該屬性默認附加到某些屬性(第8.6.1節)。

內部的DontEnum屬性決定了什麼不被枚舉枚舉(第12.6.4節)列舉。 propertyIsEnumerable測試

https://developer.mozilla.org/en/docs/ECMAScript_DontEnum_attribute

的EcmaScript 3規範定義了很多與DontEnum屬性的屬性。 http://bclary.com/2004/11/07/

這實際上並沒有解決整個拼圖,因爲例如Array.prototype.pop沒有明確列出爲具有DontEnum屬性,只有Array.prototype本身被列爲如此。這可能暗示了本地函數的DontEnum屬性,但是我找不到這個參考。 MDN的第一個引用例如將String.prototype.indexOf描述爲非可枚舉,而EcmaScript 3規範中也沒有明確提及。

相關問題