js高级程序设计-6章面向对象的程序设计

  1. 创建简单对象
    1. 读取属性的特性
  2. 创建特定形式的对象
    1. 工厂模式
    2. 构造函数
    3. 重写原型
    4. 原型模式的弊端

重新看一次这一章..

对象就是无序属性的集合,属性包含基本值,对象和函数

创建简单对象

我们可以 new Object()或者通过对象自变量{}的形式来创建。

每个属性都有一些特性,包括

  • Configurable:能够通过 delete 删除或者重新定义属性的特性
  • Enumerable:能否通过 for in 循环返回属性
  • Writable:是否可以修改属性的值
  • Value:属性的数据值

一般这些特性都是 true 的,想要修改的话,我们只能使用Object.defineProperty来进行修改。

有种叫做访问器属性,只能通过 defineProperty 来进行定义,我们可以定义 get 和 set 方法,当然可以不全部指定。

我们还可以通过 defineProperties 来一次定义多个属性。

读取属性的特性

Object.getOwnPropertyDescriptor 可以得到想要的属性的特性。

创建特定形式的对象

工厂模式

最初是工厂模式的,就是简单的一个方法,每次 new Object(),然后添加属性,最后返回这个新的对象回去,但是问题来了,我们得不到创建出来的东西的类型,于是有了构造函数的模式

构造函数

我们使用构造函数来创建对象,每个对象都能访问到 contructor(构造函数)属性,该属性指向构造函数(注意这个 constructor 并不是实例本身拥有的,而是原型对象会有这个 constructor,然后属性查找找到了原型上的 contructor 而已!!!!!)。

只要创建了一个新函数,就会为该函数创建一个 prototype,指向该函数的原型对象。

原型对象会有一个 constructor,指向构造函数。

实例对象只拥有一个指针能指向原型对象,一般叫做proto,基本都是被隐藏的属性!!如果我们想要遍历原型链的话,可以通过 ES6 的 Object.getPrototypeOf 来拿,最后一层为 null。

所以

  • 只有原型对象才会有 contructor!!其他的实例对象能够访问是因为查找了原型!!
  • 只有函数才有 prototype!!!实例对象也拥有指针指向原型对象,就是proto!!!

我们一旦在实例上申明了属性覆盖了原型属性,除非我们使用delete,才能够访问到原型属性。

Object.getOwnPropertyDescriptor 只能得到自己对象上属性的描述符,想得到原型对象上的,只能直接在原型对象上调用这个方法。

想要判断属性是不是原型属性:!Object.hasOwnProperty(name) && (name in object)

注意 constructr 和proto规范上也是 enumerable 为 false 的,当时并不是所有的浏览器都是这么实现的

Object.keys 可以得到 for in 循环的所有属性,当然不包括 enumerable 为 false 的;而 Object.getOwnPropertyNames()可以得到所有的实例属性,包括不可枚举的,但是proto这种不开放的还是得不到。

高程 145 页是有问题的,他说实例是有 constructor 的,其实没有..

重写原型

一般情况下我们为原型赋予新的属性,得一次次的敲,也可以直接重新给原型对象赋一个新对象

但是问题是我们新建的对象没有 constructor 了,我们可以在对象里面手动设置为原构造函数。但是直接设置的话,enumerable 就是 true 了,所以我们可以用Object.defineProperty来创建。

我们哪怕在生成了之后再进行原型对象的属性赋予,也是可以的。毕竟就是一个指针嘛,但是如果重设成一个对象,那么原来的原型还是老的。新的原型就是新设置的。

注意原型对象的 this 也被绑定到了新对象!!就是输如果原型方法 return this,返回的是自身!!

原型模式的弊端

原型模式最大的弊端是在共享属性,如果属性是一个函数的话,还不会有什么问题,如果属性不是函数的话,可能会造成相互影响的问题,除非每次 new 的时候都比较小心一点。

所以基本上构造函数肯定是和原型模式一起使用的。

这里有个什么动态的原型模式,很无聊,就是在构造函数内部进行判断,然后初始化原型…

还有个什么寄生构造函数模式,乱七八糟的,就是用 return 一个新的对象来替代 new 出来的新对象,没啥价值…


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 981909093@qq.com

文章标题:js高级程序设计-6章面向对象的程序设计

文章字数:1.2k

本文作者:泽鹿

发布时间:2019-08-28, 16:45:23

最后更新:2019-08-28, 16:45:23

原始链接:http://panyifei.github.io/2019/08/28/读书笔记/Javascript高级程序设计/6章面向对象的程序设计/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏