[英]Why are JavaScript Primitive-Variables immutable and Object-Variables not?
有一種方法可以在原型屬性的幫助下將成員函數或成員屬性添加到 Number、String 等...-Variables:
Number.prototype.member = function(){ console.log('number-member-function called'); };
或者在變量本身的原型屬性的幫助下:
var num = 7;
num.__proto__.member = function(){ console.log('number-member-function called'); };
就像任何其他類型的 JavaScript 類型一樣。 但是 JavaScript 中 Primitives 和 Objects 的實現有什么區別,因此下面的代碼不適用於 Numbers 而適用於 Objects?
var num = 7;
num.member = function(){ console.log('number-member-function called'); };
num.member(); // TypeError: num.member is not a function
var obj = {};
obj.member = function(){ console.log('object-member-function called'); };
obj.member(); // object-member-function called
有沒有人大約知道 JavaScript 原語和對象是如何在引擎蓋下實現的? 因為所有瀏覽器中的所有 JavaScript 實現都必須完全相同或幾乎相同,因為調用成員的 Number-Function 會引發錯誤。
當您對boolean
、 string
和number
類型使用文字表示法時,不會使用構造函數 (Boolean, String, Number)。 原始類型的行為仍然幾乎與使用new
運算符實例化時一樣,但它們是真正的原始類型。
只有當您嘗試將它們用作對象或嘗試使用構造函數的屬性時,JavaScript 解釋器才會在幕后圍繞它們創建一個包裝對象。 在此之后,包裝器對象被丟棄,您將再次處理原始類型。 所以:
var num = 7; //primitive
// You are trying to use num as an object: a wrapper object gets created and discarded just after the assignment
num.member = function(){ console.log('number-member-function called'); };
// This will throw an error, because here num is primitive again (member was defined on the discarded wrapper)
num.member();
可以在 Cody Lindley 根據 ECMA-262 第 3 版規范編寫的“JavaScript Enlightenment”一書中找到有關此主題的更多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.