tcl科技|JavaScript 函数( 二 )


如果实际参数过多了 , 超出的参数值将被忽略 。 如果实际参数值过少 , 缺少的值将会被替换为 undefined 。 对参数值不会进行类型检查:任何类型的值都可以被传递给参数 。
方法调用模式当一个函数被保存为对象的一个属性时 , 我们称它为一个方法 。 当一个方法被调用的时候 , this 被绑定到该对象 。 如果一个调用表达式包含一个属性存取表达式( 即一个 . 表达式或 [ subscript
下标表达式 ) , 那么它当作一个方法来调用 。
varmyobject={value:0increment:function(inc){this.value+=typeofinc==='number'?inc:1myobject.increment()document.writeln(myobject.value)myobject.increment(2)document.writeln(myobject.value)
方法可以使用 this 去访问对象 , 所以它能从对象中取值或者修改该对象 。 this 到对象的绑定发生在调用的时候 。 这个「超级」迟绑定使得函数可以对 this 高度复用 。 通过 this 可取得它们所属对象的上下文的方法称为公共方法 。
函数调用模式当一个函数并非一个对象的属性时 , 那么它被当作一个函数来调用:
varsum=add(34)
当函数以此模式调用时 ,this 被绑定到全局对象 , 这是语言设计上的一个错误 。 倘若语言设计正确 , 当内部函数被调用的时候 , this 应该仍然被绑定到外部函数的 this 变量 。 这个设计错误的后果是方法不能利用内部函数来帮助它工作 , 因为内部函数的 this 值绑定了错误的值 , 所以不能共享该方法对对象的访问权 。 幸运的是 , 有一个很容易的解决方案:如果该方法定义一个变量并给它赋值为 this , 那么内部函数就可以通过那个变量访问到 this 。
myobject.double=function(){varthat=thisvarhelper=function(){that.value=https://mparticle.uc.cn/api/add(that.valuethat.value)helper()myobject.double()document.writeln(myobject.value)
构造器调用模式JavaScript 是一门基于原型继承的语言 。
这意味着对象可以直接从其他对象继承属性 。 该语言是无类别的 。
这偏离了当今编程语言的主流 。 当今大多数语言都是基于类的语言 。 尽管原型继承有着强大的表现力 , 但它并不广泛理解 。 JavaScript 本身对其原型的本质也缺乏信心 , 所以它提供了一套和基于类的语言类似的对象构建语法 。
有类型化语言编程经验的程序员们很少有愿意接受原型继承的 , 接受原型继承的则认为借鉴类型化语言的语法模糊了这门语言真实的原型本质 , 真是两边都不讨好 。
如果在一个函数前面带上 new 来调用 , 那么将创建一个隐藏连接到该函数的 prototype 成员的新对象 , 同时 this 将会被绑定到那个新对象上 。
new 前缀也会改变 return 语句的行为 。
// 创建一个名为 Quo 的构造器函数 , 它构造了一个带有 status 属性的对象 。 varQuo=function(string){this.staus=string// 给 Quo 的所有实例提供一个名为 get_status 的公共方法Quo.prototype.get_status=function(){returnthis.staus// 构造一个 Quo 实例varmyQuo=newQuo(\"confused\")document.writeln(myQuo.get_status())
目的就是结合 new 前缀调用的函数被称为构造函数 , 按照约定 , 它们保存在以大写格式命名的变量里 , 如果调用构造器函数时没有在前面加上 new , 可能会发生非常糟糕的事情 , 既没有编译时警告 , 也没有运行时警告 , 所以大写约定非常重要 。