热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JavaScript高等程序设计-择要笔记-4

申明:此择要笔记系列是我近来看《JavaScript高等程序设计(第3版)》顺手所记。内里分条列举了一些我以为主要的、须要记下的、对我有协助的点,是依据我看的递次来的。择要笔记自身

申明:

此择要笔记系列是我近来看《Javascript高等程序设计(第3版)》顺手所记。
内里分条列举了一些我以为主要的、须要记下的、对我有协助的点,是依据我看的递次来的。
择要笔记自身没有系统性,没有全面性可言,写在这里供有肯定基本的前端开发者参考交换。
内里的知识点、例子大部份来源于本书,或许延长出来的,都经由我的测试是对的,然则没办法保证100%准确,假如有人看到毛病的处所,愿望指出来,感谢。

关于继续

1. 原型链概述

function Grandpa () {
this.name = 'Grandpa'
}
Grandpa.prototype.sayName = function () {
console.log(this.name)
}
function Parent () {
this.name = 'Parent'
}
Parent.prototype = new Grandpa()
Parent.prototype.sayHello = function () {
console.log('hello')
}
var ming = new Parent()
var li = new Parent()
ming.sayName() // 'Parent'
ming.sayHello() // 'hello'
ming.sayHello === li.sayHello // true
ming.sayName === li.sayName // true
ming instanceof Parent // true
ming instanceof Grandpa // true
ming.cOnstructor=== Parent // false 因为在上面从新了 Parent 的原型,而且没有从新指定 constructor
ming.cOnstructor=== Grandpa // true 因为上面没有重写 Grandpa 的原型
ming.__proto__ === Parent.prototype // true
ming.__proto__ === Grandpa.prototype // false
Parent.prototype.__proto__ === Grandpa.prototype // true

2. 肯定原型和实例的关联

两种要领: instanceof 操纵符和 isPrototypeOf(),
如上例:

Parent.prototype.isPrototypeOf(ming) // true
Grandpa.prototype.isPrototypeOf(ming) // true
Object.prototype.isPrototypeOf(ming) // true

3. 给原型增加要领的代码肯定放在替代原型的语句以后,不然无效

4. 原型链的题目

题目1. 援用范例的继续在多个实例之间会同享,无论是原型中增加的属性照样组织函数中增加的属性。如:

function Grandpa () {
this.friends = ['ming', 'li']
}
function Parent () {
}
Parent.prototype = new Grandpa()
var ming = new Parent()
var li = new Parent()
ming.friends.push('wang')
console.log(ming.friends) // ['ming', 'li', 'wang']
console.log(li.friends) // ['ming', 'li', 'wang']
ming.friends === li.friends // true

题目2. 在建立子范例的实例中,不能向超范例的组织函数中通报参数

6. 借用组织函数(或叫捏造对象或典范继续)

可以处理援用范例的继续在多个实例之间同享的题目
如:

function Grandpa () {
this.friends = ['ming', 'li']
}
function Aunt () {
Grandpa.call(this)
}
var ming = new Aunt()
var li = new Aunt()
ming.friends // ['ming', 'li']
ming.friends.push('wang')
li.friends // ['ming', 'li']
ming.friends // ['ming', 'li', 'wang']

7. 借用组织函数可以处理不能向超范例的组织函数中通报参数的题目。

如:

function Grandpa (name) {
this.name = name
}
function Parent (name, age) {
Grandpa.call(this, name)
this.age = age
}
var ming = new Parent('ming', 15)
ming.age // 15
ming.name // 'ming'

注重:这类状况,为了防止超范例的组织函数(Grandpa)重写子范例(Parnt)的属性,应在挪用超范例组织函数后,再增加应该在子范例中定义的属性

8. 借用组织函数的题目。

题目1. 函数没有复用,占用内存多。
题目2. 超范例原型中定义的要领,对子范例而言是不可见的,效果只能运用组织函数形式。

9. 组合继续

有时刻也叫伪典范继续。思绪是,运用原型链对原型属性和要领举行继续,借用组织函数完成对实例属性的继续。
如:

function Grandpa (name) {
this.name = name
this.friends = ['li']
}
Grandpa.prototype.sayName = function () {
console.log(this.name)
}
function Parent (name, age) {
Grandpa.call(this, name)
this.age = age
}
Parent.prototype = new Grandpa()
Parent.prototype.sayAge = function () {
console.log(this.age)
}
var ming = new Parent('ming', 12)
var wang = new Parent('wang', 15)
ming.name // 'ming'
ming.friends // ['li']
ming.friends.push('zhang')
wang.friends // ['li']
ming.sayName() // 'ming'
ming.sayAge() // 12
ming.sayName === wang.sayName // true
ming.sayAge === wang.sayAge // true
ming instanceof Parent // true
ming instanceof Grandpa // true

10. 原型式继续

function object (o) {
function F () {}
F.prototype = o
return new F()
}

实际上,object() 对传入个中的对象执行了一次浅拷贝。如:

var person = {
name: 'wang',
friends: ['li']
}
var person1 = object(person)
person1.name // 'wang'
person1.friends // ['li']
person1.name = 'zhang'
person.name // 'wang'
var person2 = object(person)
person1.friends.push('yang')
person2.friends // ['li', 'yang']
person2.friends === person.friends // true
person1.friends === person.friends // true

这类原型式继续,必需有一个对象作为另一个对象的基本。把基本对象传入 object() 函数,把获得的对象依据详细需求做修正即可。
然则别忘了一切获得的对象援用范例是同享的。

es5 新增了 Object.create() 要领范例了原型式继续。

这个要领接收两个参数,一个用作新对象的原型对象,一个(可选的)为新对象定义分外属性的对象。
在传入一个参数的状况下, Object.create() 和 object() 的行动雷同。
Object.create()的第二个参数与 Object.defineProperties() 的第二个参数花样雷同:每一个属性都是经由过程本身的描述符来定义的。
这类体式格局指定的任何属性都邑掩盖原型对象上的同名属性。
如:

var person = {
name: 'wang',
friends: ['li']
}
var person1 = Object.create(person, {
name: {
value: 'zhang'
},
friends: {
value: ['a', 'b']
}
})
person1.name // 'zhang'
person1.friends // ['a', 'b']
person.friends // ['li']
// 支撑 Object.create() 的浏览器有 IE 9+,Firefox 4+, Safari 5+, Opera 912+, Chrome.

11. 寄生式继续

寄生式继续是与原型式继续严密相干的一种思绪,和工场形式相似。如:

function createAnother (original) {
var clOne= object(original)
clone.sayHi = function () {
console.log('hi')
}
return clone
}
var person = {
name: 'wang',
friends: ['li']
}
var person1 = createAnother(person)
person1.friends // ['li']
person1.sayHi() // 'hi'

新的对象person1不仅具有person的一切属性和要领,另有本身的 sayHi() 要领。
树模的 object() 函数不是必需的,任何可以返回新对象的函数都实用于此形式。
注重:运用寄生式继续来为对象增加函数,会因为不能做到函数复用而降低效率,这一点与组织函数形式相似。

12. 组合继续的题目。

无论什么状况下都邑挪用两次超范例的组织函数。一次是在建立子范例原型的时刻,一次是在子范例组织函数内部。
如:

function Grandpa (name) {
this.name = name
this.friends = ['ming']
}
Grandpa.prototype.sayName = function () {
console.log(this.name)
}
function Parent (name, age) {
Grandpa.call(this, name)
this.age = age
}
Parent.prototype = new Grandpa() // 第一次挪用超范例的组织函数 Grandpa(),
// 此时原型上有一个friends属性(值是['ming'])和name属性(值undefined,因为没有传参)
Parent.prototype.sayHi = function () {
console.log('hi')
}
var wang = new Parent('wang', 15) // 第二次挪用超范例的组织函数 Grandpa(),在 Parent() 函数内部挪用,
// 这一步的操纵, Parent 的实例 wang 的属性会掩盖 Parent 的原型上的同名属性 name

12. 寄生组合式继续

基本形式以下:

function inheritPrototype (subType, superType) {
var prototype = object(superType.prototype)
prototype.cOnstructor= subType
subType.prototype = prototype
}
function Grandpa (name) {
this.name = name
this.friends = ['ming']
}
Grandpa.prototype.sayName = function () {
console.log(this.name)
}
function Parent (name, age) {
Grandpa.call(this, name)
this.age = age
}
inheritPrototype(Parent, Grandpa) // 这里没有挪用超范例的组织函数 Grandpa() ,然则这里挪用了一个函数内部的组织函数
Parent.prototype.sayHi = function () {
console.log('hi')
}
var li = new Parent('li', 20) // 挪用超范例的组织函数 Grandpa(),在 Parent() 函数内部挪用

这类形式的优点是只挪用一次 Grandpa() 组织函数,因而防止了在 Parent.prototype 上建立不必要的、过剩的属性。
作者讲,开发人员普遍以为寄生组合式继续是援用范例最理想的继续范式。

继续部份悉数完毕

推荐阅读
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 在编写业务代码时,常常会遇到复杂的业务逻辑导致代码冗长混乱的情况。为了解决这个问题,可以利用中间件模式来简化代码逻辑。中间件模式可以帮助我们更好地设计架构和代码,提高代码质量。本文介绍了中间件模式的基本概念和用法。 ... [详细]
  • 本文介绍了获取关联数组键的列表的方法,即使用Object.keys()函数。同时还提到了该方法在不同浏览器的支持情况,并附上了一个代码片段供读者参考。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • macOS Big Sur全新设计大版本更新,10+个值得关注的新功能
    本文介绍了Apple发布的新一代操作系统macOS Big Sur,该系统采用全新的界面设计,包括图标、应用界面、程序坞和菜单栏等方面的变化。新系统还增加了通知中心、桌面小组件、强化的Safari浏览器以及隐私保护等多项功能。文章指出,macOS Big Sur的设计与iPadOS越来越接近,结合了去年iPadOS对鼠标的完善等功能。 ... [详细]
author-avatar
娜是相当滴好4
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有