有一种方法可以在prototype-property的帮助下将一个成员函数或成员属性添加到Number,String,ect ...- Variables:
Number.prototype.member = function(){ console.log('number-member-function called'); };
Run Code Online (Sandbox Code Playgroud)
或者在变量本身的原始属性的帮助下:
var num = 7;
num.__proto__.member = function(){ console.log('number-member-function called'); };
Run Code Online (Sandbox Code Playgroud)
就像任何其他类型的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
Run Code Online (Sandbox Code Playgroud)
有没有人知道JavaScript Primitves和对象是如何在幕后实现的?因为所有浏览器中的所有JavaScript实现必须完全相同或几乎完成,因为使用名为member的Number-Function抛出错误.
当您使用文字符号的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();
Run Code Online (Sandbox Code Playgroud)
关于这个主题的更多信息可以在Cody Lindley的"JavaScript Enlightenment"一书中找到,该书基于ECMA-262,第3版规范.