有一种方法可以在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抛出错误。
答案 0 :(得分:6)
对boolean
,string
和number
类型使用文字表示法时,不使用构造函数(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版规范。