美文网首页
06-1 | 读JavaScript 高程

06-1 | 读JavaScript 高程

作者: cemcoe | 来源:发表于2020-05-25 21:26 被阅读0次

接上篇

知识点:
1.构造函数原型实例三者是怎样的一个关系?
2.如何确定一个属性是在对象本身还是在原型身上?
3.原型方法创建对象的缺点?
4.较为合理的创建对象的方案是原型加构造函数?
5.ES6中的class是怎么一回事?

1.构造函数原型实例三者是怎样的一个关系?

每个函数都有一个属性叫做 prototype 指向该函数的原型对象,而该原型对象也有一个属性叫做 constructor 指回了函数,两者形成了一个圈。

在采用原型创造对象时涉及三个东西,构造函数,原型对象,实例即要创建的对象。问题的关键是搞明白这三者的关系。

前面是函数和原型对象的关系,函数通过ptototype 指向原型对象,原型对象通过constructor指向函数,这就是两者的关系。

下面我们将实例添加进来。

首先是构造函数和实例的关系,实例通过构造函数创建,实例有一个属性[[prototype]] 指向构造函数的原型对象,但实例和构造函数间并无此项直接的联系。

三者的关系是这样的:彼此间通过指针连接,函数和原型是互相指的关系,实例和原型是单向指向的关系,函数和实例间没有直接的指向关系。

2.如何确定一个属性是在对象本身还是在原型身上?

先来看两个 API,hasOwnPrototype() 方法 和 in 操作符。

hasOwnPrototype() 方法只在属性存在实例本身时返回 true,当属性只存在在原型上时返回false。而 in 操作符,不管属性定义在哪里,只要有就返回 true。两者配合就可以确定属性定义的位置。

比如 in 操作符为 false 时,属性在原型和实例本身都不存在,这是就不需要 hasOwnPrototype() 出马了。而当 in 操作符为 true 且 hasOwnPrototype() 方法为 false 时,该属性存在于原型中。

3.原型方法创建对象的缺点?

对于属性中的引用类型一处更改全部都会变动,每处都会受到影响。

4.较为合理的创建对象的方案是原型加构造函数?

构造函数和原型可以互相补充,实例属性的定义交给构造函数,而实例通用的属性和方法交给原型定义。这样就可以求同存异,节约内存资源。

书中来提到了动态原型模式,寄生构造函数模式以及稳妥构造函数模式,有兴趣的可以看一下。

构造函数和原型模式结合的方式对于大部分场景已经可以解决了。

// 构造函数
function Person(name, age) {
  this.name = name
  this.age = age
}
// 原型
Person.prototype = {
  constructor: Person
  // 防止指向乱掉
  sayName() {
    console.log(this.name)
  }
}
// 创建实例对象
const p1 = new Person('cemcoe', 18)
// p1对象相当于
// p1 = {
//   name: 'cemcoe',
//   age: 10,
//   sayName() {
//     console.log('cemcoe')
//   }
// }

5.ES6中的class是怎么一回事?

首先明确一点,class只是一个语法糖。

将上面的代码使用 class 进行改写如下:

class Person {
  // 构造函数
  constructor(name, age) {
    this.name = name
    this.age = age
  }
  // 原型
  sayName() {
    console.log(this.name)
  }
}
// 使用时没有变化
// 创建实例对象
const p1 = new Person('cemcoe', 18)

可以看到 ES6 的 class 用起来代码结构更加的清晰,对函数的定义被大括号包裹着,不会显得很乱。

对创建对象方法的探索暂时告一段落,推荐使用 ES6 中的 class 来组织代码,下篇来看继承。

相关文章

  • 06-1 | 读JavaScript 高程

    接上篇 知识点:1.构造函数原型实例三者是怎样的一个关系?2.如何确定一个属性是在对象本身还是在原型身上?3.原型...

  • 05 | 读JavaScript 高程

    这是第五章引用类型,这一章涉及引用类型的种类,各个类型身上的方法等相关内容。 主要知识点: 1.引用类型和类和对象...

  • 01 | 读 JavaScript 高程

    缘起 总感觉自己前端的知识体系不是很系统,打算读一下这本很多人推荐的书,从目录来看第三版有些东西在2020年可能已...

  • 02 | 读 JavaScript 高程

    今天来瞧一瞧第二章在 HTML中使用 JavaScript script 标签属性的变化 首先是 script 标...

  • 03 | 读JavaScript 高程

    这是第三章基本概念,这一章涉及变量,操作符,语句和函数等相关内容。 主要的知识点: ECMAScript 中究竟有...

  • 06 | 读JavaScript 高程

    这是第六章面向对象的程序设计,这一章涉及到一些概念和思想,也是 JavaScript 中很重要的知识点。需要注意的...

  • 04 | 读JavaScript 高程

    这是第四章基本概念,这一章涉及变量、作用域和内存问题等相关内容。主要知识点: 值类型和引用类型的区别是什么? 如何...

  • 08 | 读JavaScript 高程

    这一篇呢是第8章,主要涉及 BOM 的相关知识。 先来看BOM,即和浏览器相关地一些东西。 知识点:1.BOM 中...

  • 07 | 读JavaScript 高程

    这是第七章函数表达式,这一章涉及函数预编译,闭包,作用域链内容。函数涉及内容繁多。 前情提要 02-1 | 读Ja...

  • 13 | 读JavaScript 高程 | 事件

    这一篇呢是第13章,内容是和事件相关。 事件可以看成是条件判断的一种条件,逻辑是某个元素发生了某个事情,我要做出相...

网友评论

      本文标题:06-1 | 读JavaScript 高程

      本文链接:https://www.haomeiwen.com/subject/wlyeahtx.html