有一种方法可以在原型(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 实现必须以相同或几乎相同的方式完成,因为调用成员的数字函数会抛出错误。
最佳答案
当您对 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 启蒙”一书。
关于javascript - 为什么 JavaScript 原始变量不可变而对象变量不可变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21971503/