接上篇,直接条列了:
- 每个函数创建时默认带有一个prototype属性,其中包含一个constructor属性,和一个指向Object对象的隐藏属性__proto__。constructor属性的值为该函数的对象。在一个函数前面加上new来调用,则会创建一个隐藏连接到该函数prototype成员的新对象(由__proto__属性来链接),同时函数的this将会被绑定到那个新对象上。
- 函数总是返回一个值;如果没有指定返回值,就返回undefined;如果当做构造函数来调用,且返回值不是对象,则返回this(该新对象);如果返回值是对象,则它作为构造函数是没有意义的!
- function A(){
- this.p = 'haha';
- return {p:'heihei'};
- }
- var a = new A();
- 函数A内部直接调用一个函数B,B的this绑定到全局对象而不是其外部函数A,这是JS设计的一个错误。我们不得不用别的方式来解决这个问题,比如在A中用一个变量(通常是that)来保存A的this作用域的引用。
- JS函数拥有一个length属性,表示函数定义时指定的形参的个数。
- 函数的arguments属性包含了调用函数时传入的所有参数,而不管函数的声明中是否定义了这些形参;arguments不是数组,只是一个“类似数组”的对象(在函数中运行arguments instanceof Array;返回false)。可以通过Array.prototype.slice.apply(arguments)将其转化为JS数组。
- 给JavaScript函数的原型增加方法(method),则所有的(构造)函数都可以用了!例如,可以给JS函数的构造者 Function 的原型增加一个method方法,则包括Object、Number等构造函数在内的所有函数都继承了该方法,这是很强大的:
- Function.prototype.method = function(name, func){
- this.prototype[name] = func;
- return this;
- };
- Object.method('method',Object.method);
-
我们可以通过修改数值类型的原型,来给数值类型增加新的方法,这里我们借用上一条中提到的method方法来给Number的原型增加一个negative方法:
- Number.method(negative,function(){
- return 0–this;
- })
- (3).negative();
- 3 .negative();
- var n = 3; n.negative();
- 3['negative']();
- 当使用函数表达式方法定义函数时,function后面的函数名可以用来递归地调用自己,并且这个名字不会被覆盖!我们来看下面的例子,
- function a(n){
- if(n>1)
- return a(n-1)+1;
- else
- return 1;
- };
- var aa = a;
- a = 1;
- aa(3);
- var b = function a(n){
- if(n>1)
- return a(n-1)+1;
- else
- return 1;
- };
- var bb = b;
- a = 3;
- bb(3);
- 为了提高JavaScript函数的封装性,我们可以定义函数化的构造器,下面是一个例子:
- var funcCons = function(spec){
- var that = {};
- that.getName = function(){
- return spec.name;
- };
- that.says = function(){
- return spec.saying || '';
- };
- return that;
- };
- var myFunc = funcCons({name:'NearEast'});