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

标签 javascript oop

有一种方法可以在原型(prototype)属性的帮助下将成员函数或成员属性添加到数字、字符串等...-变量:

 Number.prototype.member = function(){ console.log('number-member-function called'); };

或者在变量本身的原型(prototype)属性的帮助下:

 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 实现必须以相同或几乎相同的方式完成,因为调用成员的数字函数会抛出错误。

最佳答案

当您对 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 启蒙”一书。

关于javascript - 为什么 JavaScript 原始变量不可变而对象变量不可变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21971503/

相关文章:

javascript - 移相器拖放多个文本项

javascript - TS 中 "every"函数的 TypeError

javascript - setTimeout 在 for 循环中传递参数

javascript - 如何将 Javascript 变量值显示到 HTML 文档

javascript - 在 JavaScript 上使用面向对象

java - 如何通过子类访问父类变量

PHP preg_replace_callback() 和 create_function() 与 eval() 不起作用

javascript - 在 mdDialog 中创建可编辑数据为 json 的表

c++ - 说 C++ 中的数组或 Python 中的列表是类是否正确?数据结构?或两者?

java - 父类方法如何返回子类类型?这不违反继承吗?