JavaScript对象高级 ③

简介: JavaScript对象高级 ③

前言


js中的原型毫无疑问一个难点,学习如果不掌握原理就容易晕!可能这时候懂,等几个小时过后再来写就很容易蒙,任何一个js知识点,比如学习事件流,闭包,继承等,对于这些知识点我们都应该先熟练原理,然后自己整理一套属于自己的理解说辞,才不会忘。

以下是个人学习JavaScript对象高级知识笔记(由浅入深)

一、对象创建模式


1、Object构造函数模式


  • 套路: 先创建空Object对象, 再动态添加属性/方法
  • 适用场景: 起始时不确定对象内部数据
  • 问题: 语句太多

代码演示:

varp=newObject()
p= {}
p.name='Tom'p.age=12p.setName=function (name) {
this.name=name}
p.setaAge=function (age) {
this.age=age}
console.log(p)

2、对象字面量


  • 套路: 使用{}创建对象, 同时指定属性/方法
  • 适用场景: 起始时对象内部数据是确定的
  • 问题: 如果创建多个对象, 有重复代码

代码演示:

varp= {
name: 'Tom',
age: 23,
setName: function (name) {
this.name=name  }
}
console.log(p.name, p.age)
p.setName('JACK')
console.log(p.name, p.age)

3.工厂模式


  • 套路: 通过工厂函数动态创建对象并返回
  • 适用场景: 需要创建多个对象
  • 问题: 对象没有一个具体的类型, 都是Object类型

代码演示:

functioncreatePerson(name, age) {
varp= {
name: name,
age: age,
setName: function (name) {
this.name=name    }
  }
returnp}
varp1=createPerson('Tom', 12)
varp2=createPerson('JAck', 13)
console.log(p1)
console.log(p2)

4.自定义构造函数模式


  • 套路: 自定义构造函数, 通过new创建对象
  • 适用场景: 需要创建多个类型确定的对象
  • 问题: 每个对象都有相同的数据, 浪费内存

代码演示:

functionPerson(name, age) {
this.name=namethis.age=agethis.setName=function (name) {
this.name=name  }
}
varp1=newPerson('Tom', 12)
varp2=newPerson('Tom2', 13)
console.log(p1, p1instanceofPerson)

5.构造函数+原型的组合模式


  • 套路: 自定义构造函数, 属性在函数中初始化, 方法添加到原型上
  • 适用场景: 需要创建多个类型确定的对象

代码演示:

functionPerson (name, age) {
this.name=namethis.age=age}
Person.prototype.setName=function (name) {
this.name=name}
varp1=newPerson('Tom', 12)
varp2=newPerson('JAck', 23)
p1.setName('TOM3')
console.log(p1)
Person.prototype.setAge=function (age) {
this.age=age}
p1.setAge(23)
console.log(p1.age)
Person.prototype= {}
p1.setAge(34)
console.log(p1)

二.对象的继承


1.原型链继承


方式1: 原型链继承

套路

定义父类型构造函数

给父类型的原型添加方法

定义子类型的构造函数

创建父类型的对象赋值给子类型的原型

将子类型原型的构造属性设置为子类型

给子类型原型添加方法

创建子类型的对象: 可以调用父类型的方法

关键

子类型的原型为父类型的一个实例对象

代码演示:

functionparentFun() { //父类型this.parenName='我是父类型'}
//原型的数据所有的实例对象都可见parentFun.prototype.addParentFun1=function () {
console.log(this.parenName)
}
functionsonFun() { //子类型this.sonName='我是子类型'}
// 子类的原型为父类的实例sonFun.prototype=newparentFun()
// 修正sonFun.prototype.constructor为sonFun本身sonFun.prototype.constructor=sonFunsonFun.prototype.addSonFun1=function () {
console.log(this.sonName)
}
// 创建子类型的实例varnewSonFun=newsonFun()
// 调用父类型的方法newSonFun.addParentFun1() //我是父类型// 调用子类型的方法newSonFun.addSonFun1()  //我是父类型

2.借用构造函数继承


方式2: 借用构造函数继承(假的)

  • 套路
  • 定义父类型构造函数
  • 定义子类型构造函数
  • 在子类型构造函数中调用父类型构造
  • 关键
  • 在子类型构造函数中通用super()调用父类型构造函数

代码演示:

functionPerson(name, age) {
this.name=namethis.age=age}
functionStudent(name, age, price) {
Person.call(this, name, age)   // this.Person(name, age)this.price=price}
vars=newStudent('Tom', 20, 12000)
console.log(s.name, s.age, s.price)

3.组合继承


方式3: 借用构造函数的组合继承

  • 套路
  • 利用原型链实现对父类型对象的方法继承
  • 利用call()借用父类型构建函数初始化相同属性

代码演示:

functionPerson(name, age) {
this.name=namethis.age=age}
Person.prototype.setName=function (name) {
this.name=name}
functionStudent(name, age, price) {
Person.call(this, name, age) //得到父类型的属性this.price=price}
Student.prototype=newPerson()  //得到父类型的方法Student.prototype.constructor=StudentStudent.prototype.setPrice=function (price) {
this.price=price}
vars=newStudent('Tom', 12, 10000)
s.setPrice(11000)
s.setName('Bob')
console.log(s)
console.log(s.constructor)

4.new一个对象背后做了什么?


  • new一个对象背后做了些什么?
  • 创建一个空对象
  • 给对象设置__proto__, 值为构造函数对象的prototype属性值 this.proto = Fn.prototype
  • 执行构造函数体(给对象添加属性/方法)

三、总结


以上就是个人学习javaScript高级对象的知识点,如有错漏之处,敬请指正”。

相关文章
|
12天前
|
存储 JavaScript 前端开发
|
13天前
|
JavaScript 前端开发 网络架构
JavaScript编码之路【对象的增强、ES6新特性之函数的默认值设置 、rest参数 (剩余参数)、拓展运算符、对象与数组的解构赋值】
JavaScript编码之路【对象的增强、ES6新特性之函数的默认值设置 、rest参数 (剩余参数)、拓展运算符、对象与数组的解构赋值】
17 1
|
14天前
|
存储 JavaScript 前端开发
JavaScript 对象
JavaScript 对象
12 1
|
17天前
|
JavaScript Java 数据安全/隐私保护
js对象可扩展性和属性的四个特性(下)
js对象可扩展性和属性的四个特性(下)
|
18天前
|
JavaScript 前端开发 算法
虚拟DOM是React的关键技术,它是个轻量的JS对象树,模拟实际DOM结构。
【6月更文挑战第27天】虚拟DOM是React的关键技术,它是个轻量的JS对象树,模拟实际DOM结构。当状态改变,React不直接修改DOM,而是先构建新的虚拟DOM树。通过 diff 算法比较新旧树,找到最小变更,仅更新必要部分,提高性能,避免频繁DOM操作。虚拟DOM还支持跨平台应用,如React Native。它优化了更新流程,简化开发,并提升了用户体验。
20 1
|
19天前
|
JavaScript 前端开发
技术经验分享:javaScript遍历对象、数组总结
技术经验分享:javaScript遍历对象、数组总结
12 0
技术经验分享:javaScript遍历对象、数组总结
|
11天前
|
JavaScript
js 简易对象转字符串后恢复为简易对象(如 ^a=$1^b=2转对象)
js 简易对象转字符串后恢复为简易对象(如 ^a=$1^b=2转对象)
8 0
|
11天前
|
JavaScript
js 数组移除指定元素【函数封装】(含对象数组移除指定元素)
js 数组移除指定元素【函数封装】(含对象数组移除指定元素)
9 0
|
12天前
|
JavaScript
JS 数组去重(含简单数组去重【5种方法】、对象数组去重【2种方法】)
JS 数组去重(含简单数组去重【5种方法】、对象数组去重【2种方法】)
13 0