金沙国际官网_金沙国际平台登录

因为这个金沙国际官网_金沙国际平台登录网站与很多的大型澳门赌场都有合作,金沙国际官网_金沙国际平台登录尽职尽责,高效执行,保持好奇心,不断学习,追求卓越,点击进入金沙国际官网_金沙国际平台登录马上体验吧,所以现在也正式地开始了营业。

您的位置:金沙国际官网 > web前端 > 深入之从原型到原型链,Web开发者需知的15个HT

深入之从原型到原型链,Web开发者需知的15个HT

发布时间:2019-10-31 17:44编辑:web前端浏览(148)

    JavaScript 深入之从原型到原型链

    2017/05/04 · JavaScript · 原型, 原型链

    原文出处: 冴羽   

    征服 JavaScript 面试:类继承和原型继承的区别

    2017/01/30 · JavaScript · 继承

    原文出处: Eric Elliott   译文出处:众成翻译   

    图片 1

    图-电子吉他-Feliciano Guimarães(CC BY 2.0)

    “征服JavaScript面试”是我所写的一个系列文章,旨在帮助那些应聘中、高级JavaScript开发职位的读者们准备一些常见的面试问题。我自己在实际面试当中也经常会问到这类问题。系列的第一篇文章请参见“什么是闭包”

    注:本文均以ES6标准做代码举例。如果想了解ES6,可以参阅“ES6学习指南”

    原文链接:https://medium.com/javascript-scene/master-the-javascript-interview-what-s-the-difference-between-class-prototypal-inheritance-e4cd0a7562e9#.d84c324od

    对象在JavaScript语言中使用十分广泛,学会如何有效地运用对象,有助于工作效率的提升。而不良的面向对象设计,可能会导致代码工程的失败,更严重的话还会引发整个公司悲剧

    不同于其它大部分语言,JavaScript是基于原型的对象系统,而不是基于。遗憾的是,大多数JavaScript开发者对其对象系统理解不到位,或者难以良好地应用,总想按照类的方式使用,其结果将导致代码里的对象使用混乱不堪。所以JavaScript开发者最好对原型和类都能有所了解。

    Web开发者需知的15个HTML5画布应用

    2011/07/18 · HTML5 · HTML5

    下面介绍15个html5画布应用,这些图形方面的应用可以很好的帮助开发者。

    1. SketchPad

    Sketchpad 是一个优秀的HTML5应用 可以帮助用户用 Javascript 画布工具创建有用的画图应用. Sketchpad’s 画图工具有 笔刷,铅笔,填充,文字 也提供 spirographs, 常用的 shapes 和stamps.

    图片 2

    2. Canvas Color Cycling

    这个应用可以使用一些滤镜效果

    图片 3

    3. Threshold Filter

    可以把图片转化成高对比或黑白图片.

    图片 4

    4. Reflections
    可以用特别的纹理和阴影处理3D应用.

    图片 5

    5. 3D Planet Viewer

    可以查看美国航天局的图片,旋转或放大.

    图片 6

    6. Music Visualisation with SoundManager2

    这可能是第一个HTML5音乐可视化应用

    图片 7

    7. Water Ripples

    使用画布原始创建互动水纹效果

    图片 8

    8. Strange Attraction

    这是一个与众不同的demo,通过修改设置可以产生不同的效果

    图片 9

    9. CloudKick

    可以显示云端服务期的状态,cpu,内存使用状况等等。

    图片 10

    10. Liquid Particles

    这是一个有趣的液体demo,当你鼠标移动时元素会跟着你的鼠标走。

    图片 11

    11. Canvas Sphere

    由小球组成的3d球状体

    图片 12

    12. jTenorian

    当你点亮不同的按钮组合,会创作出不同的有趣的声音.

    图片 13

    13. Dynamic Image Collage

    这是一个有趣的在线的有趣的在线拼图,通过搜索找到图片,点击图片就会在画布上显示,组成有趣的拼图

    图片 14

    14. iGrapher

    iGrapher 是个免费的金融图表工具,可以显示股票等金融市场的走势图.

    图片 15

    15. Tiler 3D

    显示一个3d的图片幻灯片.

    图片 16

     

    赞 收藏 评论

    图片 17

    构造函数创建对象

    我们先使用构造函数创建一个对象:

    function Person() { } var person = new Person(); person.name = 'name'; console.log(person.name) // name

    1
    2
    3
    4
    5
    6
    function Person() {
     
    }
    var person = new Person();
    person.name = 'name';
    console.log(person.name) // name

    在这个例子中,Person就是一个构造函数,我们使用new创建了一个实例对象person。

    很简单吧,接下来进入正题:

    类继承和原型继承有何区别?

    这个问题比较复杂,大家有可能会在评论区各抒己见、莫衷一是。因此,列位看官需要打起十二分的精神学习个中差异,并将所学良好地运用到实践当中去。

    类继承:可以把类比作一张蓝图,它描绘了被创建对象的属性及特征。

    众所周知,使用new关键字调用构造函数可以创建类的实例。在ES6中,不用class关键字也可以实现类继承。像Java语言中类的概念,从技术上来说在JavaScript中并不存在。不过JavaScript借鉴了构造函数的思想。ES6中的class关键字,相当于是建立在构造函数之上的一种封装,其本质依旧是函数。

    JavaScript

    class Foo {} typeof Foo // 'function'

    1
    2
    class Foo {}
    typeof Foo // 'function'

    虽然JavaScript中的类继承的实现建立在原型继承之上,但是并不意味二者具有相同的功能:

    JavaScript的类继承使用原型链来连接子类和父类的 [[Prototype]],从而形成代理模式。通常情况下,super()_构造函数也会被调用。这种机制,形成了单一继承结构,以及面向对象设计中最紧密的耦合行为

    “类之间的继承关系,导致了子类间的相互关联,从而形成了——基于层级的分类。”

    原型继承: 原型是工作对象的实例。对象直接从其他对象继承属性。

    原型继承模式下,对象实例可以由多个对象源所组成。这样就使得继承变得更加灵活且[[Prototype]]代理层级较浅。换言之,对于基于原型继承的面向对象设计,不会产生层级分类这样的副作用——这是区别于类继承的关键所在。

    对象实例通常由工厂函数或者Object.create()来创建,也可以直接使用Object字面定义。

    原型是工作对象的实例。对象直接从其他对象继承属性。”

    prototype

    每个函数都有一个prototype属性,就是我们经常在各种例子中看到的那个prototype,比如:

    function Person() { } // 虽然写在注释里,但是你要注意: // prototype是函数才会有的属性 Person.prototype.name = 'name'; var person1 = new Person(); var person2 = new Person(); console.log(person1.name) // name console.log(person2.name) // name

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function Person() {
     
    }
    // 虽然写在注释里,但是你要注意:
    // prototype是函数才会有的属性
    Person.prototype.name = 'name';
    var person1 = new Person();
    var person2 = new Person();
    console.log(person1.name) // name
    console.log(person2.name) // name

    那这个函数的prototype属性到底指向的是什么呢?是这个函数的原型吗?

    其实,函数的prototype属性指向了一个对象,这个对象正是调用该构造函数而创建的实例的原型,也就是这个例子中的person1和person2的原型。

    那么什么是原型呢?你可以这样理解:每一个JavaScript对象(null除外)在创建的时候就会与之关联另一个对象,这个对象就是我们所说的原型,每一个对象都会从原型”继承”属性。

    让我们用一张图表示构造函数和实例原型之间的关系:

    图片 18

    在这张图中我们用Object.prototype表示实例原型

    那么我们该怎么表示实例与实例原型,也就是person和Person.prototype之间的关系呢,这时候我们就要讲到第二个属性:

    为什么搞清楚类继承和原型继承很重要?

    继承,本质上讲是一种代码重用机制——各种对象可以借此来共享代码。如果代码共享的方式选择不当,将会引发很多问题,如:

    使用类继承,会产生父-子对象分类的副作用

    这种类继承的层次划分体系,对于新用例将不可避免地出现问题。而且基类的过度派生,也会导致脆弱基类问题,其错误将难以修复。事实上,类继承会引发面向对象程序设计领域的诸多问题:

    • 紧耦合问题(在面向对象设计中,类继承是耦合最严重的一种设计),紧耦合还会引发另一个问题:
    • 脆弱基类问题
    • 层级僵化问题(新用例的出现,最终会使所有涉及到的继承层次上都出现问题)
    • 必然重复性问题(因为层级僵化,为了适应新用例,往往只能复制,而不能修改已有代码)
    • 大猩猩-香蕉问题(你想要的是一个香蕉,但是最终到的却是一个拿着香蕉的大猩猩,还有整个丛林)

    对于这些问题我曾做过深入探讨:“类继承已是明日黄花——探究基于原型的面向对象编程思想”

    “优先选择对象组合而不是类继承。” ~先驱四人,《设计模式:可复用面向对象软件之道》

    里面很好地总结了:

    __proto__

    这是每一个JavaScript对象(除了null)都具有的一个属性,叫__proto__,这个属性会指向该对象的原型。

    为了证明这一点,我们可以在火狐或者谷歌中输入:

    function Person() { } var person = new Person(); console.log(person.__proto__ === Person.prototype); //true

    1
    2
    3
    4
    5
    function Person() {
     
    }
    var person = new Person();
    console.log(person.__proto__ === Person.prototype); //true

    于是我们更新下关系图:

    图片 19

    既然实例对象和构造函数都可以指向原型,那么原型是否有属性指向构造函数或者实例呢?

    是否所有的继承方式都有问题?

    人们说“优先选择对象组合而不是继承”的时候,其实是要表达“优先选择对象组合而不是类继承”(引用自《设计模式》的原文)。该思想在面向对象设计领域属于普遍共识,因为类继承方式的先天缺陷,会导致很多问题。人们在谈到继承的时候,总是习惯性地省略这个字,给人的感觉像是在针对所有的继承方式,而事实上并非如此。

    因为大部分的继承方式还是很棒的。

    本文由金沙国际官网发布于web前端,转载请注明出处:深入之从原型到原型链,Web开发者需知的15个HT

    关键词:

上一篇:六种继承方式,深入之作用域链

下一篇:没有了