为什么JavaScript Primitive-Variables不可变和对象变量不?

时间:2014-02-23 17:13:56

标签: javascript oop

有一种方法可以在prototype-property的帮助下将一个成员函数或成员属性添加到Number,String,ect ...- Variables:

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

或借助变量本身的proto-property:

 var num = 7;
 num.__proto__.member = function(){ console.log('number-member-function called'); };

就像任何其他类型的JavaScript类型一样。 但是,在JavaScript中Primtives和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 Primitves和对象是如何在幕后实现的吗?因为所有浏览器中的所有JavaScript实现必须完全相同或几乎完成,因为使用名为member的Number-Function抛出错误。

1 个答案:

答案 0 :(得分:6)

booleanstringnumber类型使用文字表示法时,不使用构造函数(Boolean,String,Number)。原始类型的行为几乎与使用new运算符实例化的一样,但它们是真正的原始类型。

只有当您尝试将它们用作对象或者您尝试使用构造函数的属性时,JavaScript解释器才会在幕后创建一个包装器对象。 在此之后,包装器对象将被丢弃,您将再次处理基本类型。 所以:

var num = 7; //primitive

num.member = function(){ console.log('number-member-function called'); }; //you are trying to use num as an object: a wrapper object gets created and discarded just after the assignment

//this will throw an error, because here num is primitive again (member was defined on the discarder wrapper)
num.member = function(){ console.log('number-member-function called'); };

有关此主题的更多信息,请参阅本书#14; JavaScript Enlightenment"作者:Cody Lindley,基于ECMA-262,第3版规范。