keywords:symbol
,native prototypes
Symbol
symbol() 不是 object 它只是簡單的純量基型值,就算使用一樣的描述值,也保證每一個 symbol 都是獨立唯一的值
let Sym1 = Symbol("Sym"); let Sym2 = Symbol("Sym"); console.log(Sym1 === Sym2); // returns "false"
使用原生建構器的獨特之處在於不能加上 new,這樣做會擲出一個錯誤,並且可以當作物件的特性 ( property )
let sym = Symbol('hi'); sym; // Symbol(hi) sym.toString(); // 'Symbol(hi)' typeof sym; // 'symbol' let a = {}; a[sym] = 'hello'; a; // {Symbol(hi): "hello"} Object.getOwnPropertySymbols(a); // [Symbol(hi)]
Object.getOwnPropertySymbols(..) 會檢視物件,並以相當公開的方式接露這些 symbols
- symbols 實際上不是私有的,用於私有或特殊特性,很有可能是主要的用法。對大多數的開發人員它可能可以取代帶有底線 ( _ ) 前綴的特性名稱,這幾乎一定是一種慣例,帶有底線的特性代表的是『 這是一個私有 / 特殊 / 內部特性,別去動它!』
原生的原型 ( Native Prototypes )
- 每個內建的原生建構器都有自己的 .prototype 物件:Array.prototype、String.prototype,這些物件含有特殊物件子型別專屬的行為
- 舉例來說,所有字串物件以及藉由封裝的 string 基型值,都能取用 String.prototype 上被定義為方法的預設行為
- 依照說明文件上的慣例, String.prototype.XYZ 縮寫為 String#XYZ ,其他的 .prototype 也是如此
.prototype 的方法都不會就地修改字串,修改動作會從現有的值建立出一個新的值來
let a = ' xyz '; a.indexOf('z'); // 3 空格不算 a.toUpperCase(); //' XYZ ' a.trim(); // 'xyz' a; // ' xyz '
雖然是非常糟糕的主意,但其實是能修改這些原生的原型
Array.isArray(Array.prototype); // true Array.prototype.push(4,5,6); // 3 Array.prototype; // [4,5,6,constructor: ƒ, concat: ƒ, copyWithin: ƒ, fill: ƒ, find: ƒ, …] Array.prototype.length; // 3 不過還是重置為空吧,以免碰上怪事 Array.prototype.length = 0;
- 如果有一個簡單的純量基本型別值,像是 'xyz' ,要存取它的 length 特性或某個 String.prototype 方法,JavaScript 會自動封裝該值,將它包裹在對應的物件包裹器中,讓你能夠取用那些特性或方法