重读《JavaScript高档程序设计》(1)

小微 科技重读《JavaScript高档程序设计》(1)已关闭评论105字数 3560阅读模式
摘要本文同步本人掘金平台的文章:https://juejin.cn/post/6844903569317953550函数没有重载ECMAScript 函数不能像传统意义上那样实现重载。...

函数没有重载

ECMAScript 函数不能像传统意义上那样实现重载。而在其他语言(如Java)中,可以为一个函数编写两个定义,只要这两个定义的签名(接受的参数类型以及数量)不同便可[p66]。ECMAScript的类型是疏松形的,没有签名,所以是没有重载的。文章源自微观生活(93wg.com)微观生活-https://93wg.com/15659.html

function load(num){return num + 100;}function load(num,name){return num + 200;}var result = load(100); // 300文章源自微观生活(93wg.com)微观生活-https://93wg.com/15659.html

传递参数文章源自微观生活(93wg.com)微观生活-https://93wg.com/15659.html

ECMAScript 中所有的函数的参数都是按值传递的[p70]。也就是说,把函数外部的值复制给函数内部的参数,就是把值从一个变量复制到另外一个变量同样。**基本类型值的传递犹如基本类型变量的复制同样,而引用类型值的传递,则犹如引用类型变量的复制同样。**下面分开例子介绍两种不同类型为何是按值传递。文章源自微观生活(93wg.com)微观生活-https://93wg.com/15659.html

基本类型值文章源自微观生活(93wg.com)微观生活-https://93wg.com/15659.html

基本类型这个按值传递比较好理解,直接复制变量的值传递:文章源自微观生活(93wg.com)微观生活-https://93wg.com/15659.html

function addTen(num){num += 10;return num;}var count = 20;var result = addTen(count);console.log(result); // 30console.log(count); // 20 ,没有变化哈复制代码引用类型值文章源自微观生活(93wg.com)微观生活-https://93wg.com/15659.html

有些人认为引用类型的传参是依照引用来传的,那暂且认为他们的理解是正确的,那下面的示例结果如何解析呢?文章源自微观生活(93wg.com)微观生活-https://93wg.com/15659.html

function setName(obj){obj.name = &文章源自微观生活(93wg.com)微观生活-https://93wg.com/15659.html

函数声明与函数表达式文章源自微观生活(93wg.com)微观生活-https://93wg.com/15659.html

解析器在向执行环境中加载数据时,对函数声明以及函数表达式并不是等量齐观[p111]。解析器会率先读取函数声明,并使其执行任何代码以前可用(可以走访);至于函数表达式,则必需等到解析器执行到它所在的代码行,才会真正被解析。

console.log(sum(10 , 10)); // 20function sum(num1 , num2){return num1 + num2;}复制代码console.log(sum(10 , 10)); //TypeError: sum is not a functionvar sum = function(num1 , num2){return num1 + num2;}复制代码apply以及call

每一个函数都包括两个非继承而来的办法:apply()以及call()。这两个办法的用处都是在特定的作用域中调用函数,实际上等于设置函数体内this对象的值[116]。call以及apply在对象中还是挺有用途的。

apply()办法以及call()办法的作用是相同的,区分在于接管参数的方式不同。

apply

apply()办法接管两个参数:一个是在其中运行函数的作用域,另外一个是参数数组,这里的参数数组可以是Array的实例,也能够是arguments对象(类数组对象)。

function sum(num1 , num2){return num1 + num2;}function callSum1(num1,num2){return sum.apply(this,arguments); // 传入arguments类数组对象}function callSum2(num1,num2){return sum.apply(this,[num1 , num2]); // 传入数组}console.log(callSum1(10 , 10)); // 20console.log(callSum2(10 , 10)); // 20复制代码call

call()办法接管的第一个参数以及apply()办法接管的同样,变化的是其余的参数直接传递给函数。换句话说,在使用call()办法时,传递给函数的参数必需逐个罗列出来。

function sum(num1 , num2){return num1 + num2;}function callSum(num1 , num2){return sum.call(this , sum1 , sum2);}console.log(callSum(10 , 10)); // 20复制代码创立对象

尽管Object构造函数或者对象字面量均可以用来创立单个对象,然而这些方式有个显明的缺陷:使用同一个接口创立不少对象,会发生大量的重复代码。[p144]

工厂模式

工厂模式就是造一个模子发生一个个对象。

function createPerson(name , age ,job){ var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function(){ alert(this.name); }; return o; } var person1 = createPerson(&

构造函数模式

下面使用构造函数创立特定类型的对象。这里是Person类型:

function Person(name , age , job){ // 注意构造函数的首字母为大写哦this.name = name;this.age = age;this.job = job;this.sayName = function(){alert(this.name);}}var person1 = new Person(&

创立一个新对象

将构造函数的作用域赋给新对象(因而this指向了这个新对象)

执行构造函数中的代码(为这个新对象添加属性)

返回新对象

构造函数解决了重复实例话问题(也就是创立多个类似对象的问题)以及解决了对象辨认的问题。然而,像上面那样,person1以及person2共有的办法,实例化的时候都创立了,这未免过剩了。固然可以将共有的办法提取到外面,像这样:

function Person(name , age , job){this.name = name;this.age = age;this.job = job;this.sayName = sayName;}function sayName(){alert(this.name);}var person1 = new Person(&

原型模式

创立的每一个函数都有一个prototype(原型)属性,这个属性就是一个指针,指向一个对象,而这个对象的用处就是包括可以由特定类型的所有实例同享的属性以及办法。

function Person(){}Person.prototype.name = &

原型模式解决了函数同享的问题,然而也带了一个问题:实例化中对象的属性是独立的,而原型模式这里同享了。

组合使用构造函数模式以及原型模式

创立自定义类型的最多见的方式,就是组合使用构造函数模式以及原型模式。构造函数模式用于定义实例属性,而原型模式用于定义办法以及同享属性。

function Person(name , age ,job){this.name = name;this.age = age;this.job = job;this.friends = [&

public class Dog{int age;public Dog(String name ){this.age = age;System.out.println(&

function Person(name , age ,job){// 属性this.name = name;this.age = age;this.job = job;// 办法if(typeof this.sayName != &

function Person(name , age , job){var o = new Object();o.name = name;o.age = age;o.job = job;o.sayName = function(){alert(this.name);}return o;}var friend = new Person(&

稳当构造函数模式

稳当对象合适在一些安全的环境中(这些环境中会制止使用this以及new),或者避免数据被其他利用程序(如Mashup程序)改动时使用。稳当构造函数遵循与寄生构造函数相似的模式,然而有两点不同:意识新创立对象的实例办法不引用this,二是不使用new操作符调用构造函数。

function Person(name , age , job){// 创立要返回的对象var o = new Object();// 可以在这里定义私有的变量以及函数// 添加办法o.sayName = function(){alert(name); // 不使用this.name};// 返回对象return o;}var friend = Person('nicholas', 29 , 'software engineer'); // 不使用newfriend.sayName(); // 'nicholas'复制代码

以上就是微观生活(93wg.com)关于“重读《JavaScript高档程序设计》(1)”的详细内容,希望对大家有所帮助!

继续阅读
 
小微
  • 版权声明: 本文部分文字与图片资源来自于网络,转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们(管理员邮箱:81118366@qq.com),情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!
  • 转载请务必保留本文链接:https://93wg.com/15659.html