原型 以及 类(class)
原型 以及 类(class)
函数的 prototype
** 实例对象.prototype 查看原型 及原型的属性方法**
普通对象的 proto , ie 安全级别高,不支持
区别:
函数的 prototype,父亲改自己的基因。有生育能力,但是可以不生。
对象的proto,孩子找父亲,一层一层往上找,越到上面越抽象
原型链:本质proto
hasOwnProperty(类似 in –**‘属性名’ in 对象**) 判断自己身上是否有那个属性,原型链中继承来的不算
console.log(p1.hasOwnProperty(‘name’));
console.log(Object.hasOwnProperty(‘name’));
检测对象有没有某个属性
下面两种包含从原型链上继承下来的
obj.属性 undefined
属性 in obj
只有自己构造函数中有的
obj.hasOwnProperty(属性名)
======
**伪数组和数组的区别 **
伪数组无法调用真数组的方法。
伪数组的原型(_proto_)的 construction(父-构造函数)是 HTMLCollection();<HTML 元素的集合>
而真数组的原型的 construction 是 Array();
**类****(class,本质就是 function 的语法糖)**
OCP 开闭原则, 对扩展开放,对修改关闭。
尽量不要修改类,而是通过继承去扩展类
- 类中的构造器不是必须写的,要对实例进行一些初始化操作,如添加指定属性时才写。
- 如果 A 类继承了 B 类,且 A 类中写了构造器,那么 A 类构造器中的 super()是必须要调用的
- 类中所定义的方法,都是放在类的原型对象上,供实例使用。
1 |
|
>> Class 的静态方法/属性
- 就是类本身的属性和方法 使用 static关键字定义
- 调用是使用类本身来调用
- 而未用 static关键字定义的属性 方法 都是实例上的属性方法
- static 修饰的方法中的 this 指向类本身 并非实例。所有 static 方法中可以调用其他静态属性或方法
>> get / set
- get 或 set 定义的看起来是 方法,**实际上是属性**,可以理解为 vue 中的计算属性,计算属性本质就是 get
- 调用不加小括号, 因为是属性
- get 定义的属性必须要有返回值。
- 一个属性 同时具有 set get, 然后就不懂了, 待补充
单例模式
{ 无非是用一个变量来标志当前是否已经为某个类创建过对象,如果是,则在下一次获取该类的实例时,直接返回之前创建的对象:}
优点:
- 在内存中只有一个对象,节省内存空间;(创建 websocket 实例对象)
- 避免频繁的创建销毁对象,可以提高性能;
- 避免对共享资源的多重占用,简化访问;
- 为整个系统提供一个全局访问点。
缺点:
- 不适用于变化频繁的对象;
- 滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;
- 如果实例化的对象长时间不被利用,系统会认为该对象是垃圾而被回收,这可能会导致对象状态的丢失;
封装进阶
为什么需要封装隐藏?
安全性:不想被看到具体实现,防止被篡改
封装隐藏
隐藏 放在函数内部执行,改变作用域
使用 (暴露) 通过 return
封装对象
** ** 构造函数,原型方法
new 对象
利用自执行函数,window 暴露
1 |
|
深拷贝浅拷贝
-准备知识点-
–>基本的数据类型之间赋值,得到都是独立的值、
–>而引用数据类型之间的赋值,则是获取到的地址,数据任何变化,赋值方和被赋值方都会改变
所以我们需要拷贝、且拷贝也是引用数据类型上才存在的操作。
>>浅拷贝
- 只是拷贝目标对象的一层数据,也就是 如果该对象或者数组中除了基础数据类型外,还有其他的引用数据类型。则无法拷贝更深的数据了。
- –常用方法
- 扩展运算符 […arr] 就是浅拷贝了 arr
- =
Object.assign 方法 第一个参必须写。数组就写 []、对象就写{},在括号里面还可以添加新的属性。一个参数中的值,若在拷贝对象中存在,则还是使用拷贝对象的,如果不存在,则使用 assign 方法提供的。其实第一个参数就是设置默认值
第二到 n 个参数参数就是要拷贝的对象或数组了。
Object.assgin
合并对象
- const o1 = { a: 1 };const o2 = { b: 2 };const o3 = { c: 3 };
const obj = Object.assign(o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }
console.log(o1); // { a: 1, b: 2, c: 3 }, // 第一个参数 target, 执行后自身也会改变。
合并具有相同属性的对象
- const o1 = { a: 1, b: 1, c: 1 };const o2 = { b: 2, c: 2 };const o3 = { c: 3 };
const obj = Object.assign({}, o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }
属性被参数中具有相同属性的其他对象覆盖。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!