qzuser

qzuser 查看完整档案

填写现居城市  |  填写毕业院校  |  填写所在公司/组织填写个人主网站
编辑

Php爱好者

个人动态

qzuser 赞了回答 · 2020-08-24

解决Js中正则表达式 多行模式下的疑问

这是因为你的正则^.*$在你的文本中,多行模式下匹配到的第一个结果是一个位置,由于此时的lastIndex是0,下次开始还是从这个位置匹配,因此又匹配到了这个位置。你如果把正则改为^.+$,就正常了,因为这个正则不会匹配位置

关注 2 回答 1

qzuser 提出了问题 · 2020-08-23

解决Js中正则表达式 多行模式下的疑问

const str = `
dasd djsai hf cdu
dja cjsi aerhu chdu
xia deji cjxi asj
`;
const reg = /^.*$/gm;
reg.exec(str);

重复执行reg.exec(str)都是返回一个结果
image

按照我的理解,.不匹配换行符,应该依次输出dasd djsai hf cdu、dja cjsi aerhu chdu、xia deji cjxi asj。

那么为什么会发生如图所示的情况呢?

关注 2 回答 1

qzuser 赞了回答 · 2020-08-09

解决关于ES6中继承的问题 B继承A B.__proto__ = A?

B.__proto__.__proto__ 确实是 Function.prototype ,但首先它的原型是 A ,其原型的原型才是函数原型。因为定义在 A 上的静态方法 B 也要继承。


更新:


每一个对象都有原型,但是对象的原型并不一定是对象的构造函数的 prototype 属性。

我在这里先声明一下几个术语,前端届对原型的称呼一直比较混乱:

  • 对象:JS 中一切非原始值皆对象,函数也是对象的一种
  • 原型:

    • 每个对象都有一个原型,原型本身也是一个普通的对象。
    • 使用点操作符或者 [ ] 访问属性时,会先检查对象本身的属性,如果不存在则会检查对象的原型,如果还不存在则会继续检查对象原型的原型直到原型的尽头 Object.prototype ,它没有原型,它的原型是 null,这个就是所谓的原型链。
    • 获取对象的原型可以用标准的 Object.getPrototypeOf(obj),或者非标准的 obj.__proto__, 以下我都用 Object.getPrototypeOf(obj).
    • 对象的默认 toString, valueOf 方法都来自 Object.prototype。
  • 函数:函数是一种特殊的对象,所以函数也有原型,通过 function 语句声明的函数的原型是 Function.prototype。函数的 call,apply,bind 方法都来自 Function.prototype 上。
  • 构造函数:除了箭头函数外,普通函数都可以当作构造函数用,用法就是使用 new 操作符。
  • 类:ES6 的类是一种特殊的函数,只能通过 new 操作符来使用,不能当普通函数来直接调用。
  • 函数.prototype: 函数对象还有一个特殊的属性,名字叫 prototype。这个我们还是别叫 函数的原型 了吧,因为函数作为对象看待它本身确实是有原型的,所以我们叫它函数的prototype属性,以区别于函数的原型,即:Object.getPrototypeOf(fn) vs fn.prototype.
  • new 一个构造函数发生了什么:

    • 新建一个对象
    • 把对象的原型指向构造函数的 prototype 属性
    • 把对象当 this 运行一遍构造函数
  • 什么是继承?

    • JS 的继承发生在对象之间,而非类之间,就像现实中的儿子继承爸爸,不需要先有儿子类和爸爸类,让儿子类 extends 爸爸类然后实例化。JS 中的对象直接继承另一个对象。
    • JS 的继承是使用原型来实现的。对象属性查找会检查原型链,这就是继承概念的体现。
    • ES5 加入的 Object.create API 就是把一个对象当原型来创建另一个对象之用。
  • 基于 prototype 的继承模拟基于 class 的继承:

    • 函数的 prototype 属性就是用来模拟基于 class 的继承的,否则只要能从一个对象构造另一个对象那 prototype 继承就有了。
    • 当我们 new 一个 class/函数 时,其实我们是把 class/函数的prototype 属性当原型来构造新对象的。你把方法和属性定义在函数的prototype属性上,用起来和传统的类定义方法和字段一个感觉。
    • 对象的构造器本质就是一个 constructor 属性,所以函数的 prototype.constructor 会自动回指到函数本身,以便 new 出来的对象能正确获取到构造器。

说的有点多,回到你的问题:

每一个对象都有原型,但是对象的原型并不一定是对象的构造函数的 prototype 属性。

且不说 constructor 属性并不是一个锁死的属性,JS 中的有些对象也并不一定存在一个构造器。

var father = {money: 1000,house:'big house'};
// father 对象使用对象字面量定义,本质上和 new Object 一回事
// 所以 father 是用 Object 构造的
father.constructor === Object // 没问题

var son = Object.create(father); 
son.money // 这里我们说 son 继承了 father 的所有属性
Object.getPrototypeOf(son) === father; // 毛得问题吧
son.constructor // 这玩意儿会是什么?
son.constructor === father.constructor; // 嗯,来自于父亲

如上代码展示,其实 JS 中对象的构造器不是在所有场合都合理且有意义。构造函数这个概念在基于 prototype 继承的体系里其实是不需要的,它是 JS 模拟基于类的继承加入的东西。

那么题主的问题到底出现在哪里呢?出现在这里:

class是语法糖,本质上还是个函数,因此B实际上是个函数,可以看作通过new Function创建出来的Function对象实例

class 是语法糖没错,本质是函数也没错,错在 class B 并不能看作是 new Function 构造出来的,class A 可以,但是 B 不行。因为 B extends A,B 是通过 A 构造出来的。你忘了,JS 继承的本质是对象继承。 class B extends A 这里隐含了两个 prototype 继承。 B.prototype 继承了 A.prototype, 同时 B 继承了 A。

class A {
  static p = 1;
}
class B extends A{}

B.p; // 1
Object.getPrototypeOf(B.prototype) === A.prototype; // true
Object.getPrototypeOf(B) === A; // true
//或者说用非标准属性表示 B.__proto__ === A

因为静态属性也是需要继承的,所以 B 并不是直接通过 new Function 构造出来的,B 是通过 A 作为原型构造出来的,即 B = Object.create(A); 这样 B 才能获得 A 上定义的静态属性和方法,才符合基于 class 的继承的表现。

所以,B.constructor 在这里并没有很符合实际的意义,并不存在一个函数它把 B 构造了出来。从原型的角度看待就不存在这种问题,B 用了 A 当原型,A 用了 Function.prototype 当原型,仅此而已。

关注 2 回答 3

qzuser 关注了问题 · 2020-08-07

解决关于ES6中继承的问题 B继承A B.__proto__ = A?

先附上代码

class A{}
class B extends A{}
B.__proto__ === A //true
B.__proto__ === Function.prototype //false
typeof B //function
B.constructor === Function //true

我们知道,每个实例对象( object )都有一个私有属性(称之为 __proto__ )指向它的构造函数的原型对象(prototype

class是语法糖,本质上还是个函数,因此B实际上是个函数,可以看作通过new Function创建出来的Function对象实例

那么问题来了B.__proto__不应该等于Function.prototype吗?为什么等于A呢?这是特殊规定的吗?

关注 2 回答 3

qzuser 提出了问题 · 2020-08-07

解决关于ES6中继承的问题 B继承A B.__proto__ = A?

先附上代码

class A{}
class B extends A{}
B.__proto__ === A //true
B.__proto__ === Function.prototype //false
typeof B //function
B.constructor === Function //true

我们知道,每个实例对象( object )都有一个私有属性(称之为 __proto__ )指向它的构造函数的原型对象(prototype

class是语法糖,本质上还是个函数,因此B实际上是个函数,可以看作通过new Function创建出来的Function对象实例

那么问题来了B.__proto__不应该等于Function.prototype吗?为什么等于A呢?这是特殊规定的吗?

关注 2 回答 3

qzuser 关注了标签 · 2017-09-23

前端

Web前端开发是从网页制作演变而来的,名称上有很明显的时代特征。在互联网的演化进程中,网页制作是Web 1.0时代的产物,那时网站的主要内容都是静态的,用户使用网站的行为也以浏览为主。2005年以后,互联网进入Web 2.0时代,各种类似桌面软件的Web应用大量涌现,网站的前端由此发生了翻天覆地的变化。网页不再只是承载单一的文字和图片,各种富媒体让网页的内容更加生动,网页上软件化的交互形式为用户提供了更好的使用体验,这些都是基于前端技术实现的。

Web前端优化
  1. 尽量减少HTTP请求 (Make Fewer HTTP Requests)
  2. 减少 DNS 查找 (Reduce DNS Lookups)
  3. 避免重定向 (Avoid Redirects)
  4. 使得 Ajax 可缓存 (Make Ajax Cacheable)
  5. 延迟载入组件 (Post-load Components)
  6. 预载入组件 (Preload Components)
  7. 减少 DOM 元素数量 (Reduce the Number of DOM Elements)
  8. 切分组件到多个域 (Split Components Across Domains)
  9. 最小化 iframe 的数量 (Minimize the Number of iframes)
  10. 杜绝 http 404 错误 (No 404s)

关注 194983

qzuser 关注了标签 · 2017-09-23

关注 115

qzuser 关注了标签 · 2017-06-02

vue.js

Reactive Components for Modern Web Interfaces.

Vue.js 是一个用于创建 web 交互界面的。其特点是

  • 简洁 HTML 模板 + JSON 数据,再创建一个 Vue 实例,就这么简单。
  • 数据驱动 自动追踪依赖的模板表达式和计算属性。
  • 组件化 用解耦、可复用的组件来构造界面。
  • 轻量 ~24kb min+gzip,无依赖。
  • 快速 精确有效的异步批量 DOM 更新。
  • 模块友好 通过 NPM 或 Bower 安装,无缝融入你的工作流。

官网:https://vuejs.org
GitHub:https://github.com/vuejs/vue

关注 137985

qzuser 关注了标签 · 2017-06-02

bootstrap

简洁、直观、强悍的前端开发框架,让web开发更迅速、简单。

关注 2838

qzuser 提出了问题 · 2017-04-23

关于laravel常驻内存的任务

用户提交订单 订单信息存到数据库 我想通过读取数据库来执行任务,任务就是curl一个网址附带post数据 然后把curl获得的数据推送到后台

看了laravel的 队列 还要push什么的 可是我的是读取数据库获取信息的 这个如何解决

关注 3 回答 2

认证与成就

  • 获得 0 次点赞
  • 获得 5 枚徽章 获得 0 枚金徽章, 获得 1 枚银徽章, 获得 4 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2017-04-22
个人主页被 223 人浏览