Pasoul

Results 30 comments of Pasoul

## 类数组对象 我们已经看到,数组中有一些特性是其他对象所没有的: - 当有新的元素添加时,自动更新`length`属性 - 设置`length`为一个较小的值,将截断数组 - 从`Array.prototype`中继承一些有用的方法 - 其类属性为`Array` 这些特性让数组和常规的对象有明显的区别,但是它们不能定义数组的本质特性。一种常常完全合理的看法把拥有一个数值length属性和对应非负整数属性的对象看做一种类型的数组。 常见的如`arguments`和一些DOM方法(如document.getElementByTagName())都是类数组对象。 **注意:**类数组对象没有继承自`Array.prototype`,那就不能在它们上面直接调用数组方法。尽管如此,可以间接地使用`Function.call`方法调用: ``` var a = {'0':'a', '1':'b' ,'2':'c', length:3} // 类数字对象 Array.prototype.join.call(a, '+') // a+b+c ```

## 微信分享 我们可以通过jssdk配置微信分享出去的标题、描述、图片和链接 ![image](https://user-images.githubusercontent.com/22902187/83100399-77bab800-a0e2-11ea-9172-abf7a27cc997.png) ### 微信分享流程 1. 在公众号设置里面配置JS安全域名 ![image](https://user-images.githubusercontent.com/22902187/83101381-ce28f600-a0e4-11ea-80a9-e390732ef59f.png) 注意安全域名一个月只能修改三次,并且一个公众号只能配三个安全域名 ![image](https://user-images.githubusercontent.com/22902187/83100706-1f37ea80-a0e3-11ea-859a-3772ff8207e4.png) 2. 在JS安全域名下,前端初始化页面时配置`wx.config`进行签名验证,然后在`wx.ready`回调里配置分享信息 ### 前端代码实现 1. 封装`initJssdk`方法,调用config接口注入权限验证配置 ``` export const initJssdk = function(storeCode, debug = false) { return new Promise(async...

## 微信支付 ### 微信支付流程 1. 在公众号开通微信支付 ![image](https://user-images.githubusercontent.com/22902187/83104015-78efe300-a0ea-11ea-933f-985bfbb21da1.png) 2. 设置支付目录 **支付授权目录说明:** 1、商户最后请求拉起微信支付收银台的页面地址我们称之为“支付目录”,例如:`https://www.weixin.com/pay.php。` 2、商户实际的支付目录必须和在微信支付商户平台设置的一致,否则会报错“当前页面的URL未注册:” **支付授权目录设置说明:** 登录微信支付商户平台(pay.weixin.qq.com)-->产品中心-->开发配置,设置后一般5分钟内生效。 **支付授权目录校验规则说明:** 1、如果支付授权目录设置为顶级域名(例如:`https://www.weixin.com/ `),那么只校验顶级域名,不校验后缀; 2、如果支付授权目录设置为多级目录,就会进行全匹配,例如设置支付授权目录为https://www.weixin.com/abc/123/,则实际请求页面目录不能为https://www.weixin.com/abc/,也不能为https://www.weixin.com/abc/123/pay/,必须为https://www.weixin.com/abc/123/ ![image](https://user-images.githubusercontent.com/22902187/83104112-a046b000-a0ea-11ea-8202-bfc7b6d070ae.png) 3. 前端网页请求生成支付订单,后端会返回支付参数prepay_id、paySign等,前端传入支付参数,调用`wx.chooseWXPay`方法,微信会在`choosePay`回调函数内告知支付结果。 ### 关键代码 1. 封装通用wxPay方法 ``` /** * 功能: 微信支付功能...

## 对象的可选属性 有事我们希望对象的形状不完全匹配,比如我们定义了一个`baby`对象,这个对象一开始没有起名字: ``` interface Person { name?:string; age:number } let baby:Person = { age: 0 }; ``` 过了一段时间,baby的名字起好了: ``` interface Person { name?:string; age:number } let baby:Person = {...

## 对象的任意属性 有时我们不希望接口限制对象的形状,比如我们定义了接口`Person`,它类似个人信息调查表,要求每个人(对象)的姓名是必填的,但是随着每个人的发展,有的慢慢的学会了英语(speakEnglish),有的进了大学(school),每个人(对象)都有不同的特点(属性): ``` interface Person { name: string; age?: number; [propName: string]: any; } let student:Person = { name: "zhangsan", speakEnglish: true, school: "清华大学" } ``` 使用`[propName: string]: any;`表示不限制对象的属性值类型,如果我们将其改成`string`:...

## 对象的只读属性 我们希望对象的一些属性在创建的时候就被赋值,之后就不能对其修改,这时我们可以使用readonly来定义只读属性。 我们创建了个人信息调查表,要求每个人的调查表都有id字段用于区分,并且该字段不能随意改动: ``` interface Person { readonly id: number; name: string; age: number } let student:Person = { id: 1, name: 'zhangsan', age: 18, }; ``` 如果我们尝试修改id的值,编译将会报错:不能给id赋值因为它是一个常量或只读属性 `student.id...

摘自原文: `第一个三目运算符需要注意,它判断是否有 childVal,即组件的选项是否写了生命周期钩子函数,如果没有则直接返回了 parentVal,这里有个问题:parentVal 一定是数组吗?答案是:如果有 parentVal 那么其一定是数组,如果没有 parentVal 那么 strats[hooks] 函数根本不会执行。` **注意这里的前提是:子组件没有钩子选项**。 假如子组件没有钩子选项,并且父选项中也没有钩子函数,你还觉得mergeField会执行吗?

## ES6类的基本用法 ### 属性和方法 使用`class`定义一个类,类被实例化之后,会自动调用`constructor`构造函数,在构造函数内部,我们通过传入的`name`参数,给属性`name`赋值,实例化生成的`cat`对象,可以调用类的`sayHi`方法。 ``` class Animal { constructor(name) { this.name = name; } sayHi() { return `my name is ${this.name}` } } let cat = new Animal("cat"); console.log(cat.sayHi());...

## typescript中类的用法 ### 修饰符public private protected 在`typescript`中,我们可以使用三种访问修饰符: - `public`修饰的属性和方法是公有的,可以在任何地方被访问到,默认所有的属性和方法都是`public` - `private`修饰的属性或方法是私有的,不能在声明它的类的外部访问 - `protected`修饰的属性或方法是受保护的,它和`private`类似,唯一区别是可以在它的子类中访问 下面举一些简单的例子: #### public ``` class Animal { public name; constructor(name) { this.name = name; } } let...

### 抽象类 `abstract`用于定义抽象类和其中的抽象方法 什么是抽象类? 首先抽象类是不允许被实例化的 ``` abstract class Animal { name; constructor(name) { this.name = name; } sayHi() {} } let cat = new Animal('cat'); ``` 上面示例中,我们尝试实力化一个抽象类,编译将会报错: `Cannot create an...