繁体   English   中英

为什么 JavaScript 原始变量不可变而对象变量不可变?

[英]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 会引发错误。

当您对booleanstringnumber类型使用文字表示法时,不会使用构造函数 (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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM