原型也不好理解,Canvas画一张笑脸

Javascript之旅——第十一站:原型也不好理解?

2015/01/28 · JavaScript · Javascript, 原型

原文出处: 一线码农的博客   

写到这篇,我的js系列也快接近尾声了,所以这个系列不会遗留js来实现面向对象的核心——原型,有些人说原型不好理解,其实嘛,要想系统的理解原型,最便捷的方式就是看看经典的书,少看些博客,博客这东西只是博主自己的个人理解,充其量是些配味的佐料。

一:继承

如果你熟悉C#的话,你肯定会知道,所有的类都是继承于Object的,这样我就拥有Object所具有的功能了,如下图中我定义的Person类。

图片 1

从图中可以看到,在C#中到处都是继承,下一步我要做的就是自定义继承,如下图中我定义的Student类,让它继承Person.Name属性。

图片 2

这些对于玩C#的人来说都是很司通见惯的,那么下一个问题来了,这些真正的面向对象的东西,在js中该怎么玩呢?当然就要用到大名鼎鼎的prototype属性了。

二:用JS来模仿C#的继承

1.默认继承Object

我们都知道在js中的所有引用类型也同样继承于Object,这样也就具有Object的功能了,但是你有没有考虑过,比如下图中的Person到底是怎么继承了Object的所有属性和方法呢?

图片 3

看到上图后,你是不是很好奇呢?其实原理真的很简单,用chorme的watch expressions一看你就一清二楚了。

图片 4

第一眼看到不知道你会不会眼晕?听我慢慢解释,从上面的图中不难看到,其实有这么个原型链的关系:

p.__proto__ =Person.prototype

Person.prototype.__proto__ -> new Object()

不知道你看懂了没?其实这里最重要的就是__proto__属性,首先你要知道,每个实例都具有这么个__proto__属性,因为这是核心,比如你要找p.toString()方法, js引擎会优先在Person function中找toString()方法,发现没有。。。花擦。。。没辙只能通过p.__proto__属性继续往上查找,到了Person.prototype,从图中可以看到prototype是一个具有constructor属性的对象,因为只有一个属性,所以也没找到tostirng()方法,然后沿着Person.prototype._proto__找到了Object,在这里我们就找到了toString()方法。

2.自定义继承

我们知道prototype是个非常重要的属性,为了模仿C#中Student类继承于Person类,这次我需要做的是让Studnet.prototype=new Person()就好了。

图片 5

从图中可以看到student实例已经含有Name属性了,我们现在已经知道有一个原型链查找的过程,比如我现在通过student.__proto__找到了new Person(),然后也看到了new Person()具有Name属性,我想你现在也知道,在Person函数中也有一个__proto__属性,它是指向Object的,如果说我在new Person()中没有找到,那么会继续通过Person.__proto__(Student.prototype.proto__)继续往上找,一直找到顶端为止。

三:详解prototype

  1. prototype到底是什么?

从上一章中我想你对prototype应该有了宏观了解,可以看到其实prototype只不过是一个包含constructor属性的Object对象,其中constructor属性是指向当前function的一个指针,代码还原如下:

JavaScript

<script type="text/javascript"> function Person() { this.Name = "ctrip"; } Person.prototype = { constructor: Person //指向Person的constructor }; var p = new Person(); </script>

1
2
3
4
5
6
7
8
9
10
11
<script type="text/javascript">
        function Person() {
            this.Name = "ctrip";
        }
 
        Person.prototype = {
            constructor: Person  //指向Person的constructor
        };
 
        var p = new Person();
    </script>

图片 6

  1. prototype上面的属性可以被所有实例共享。

这个之所以能够共享,是因为每个实例都有__proto__属性,包括function的prototype属性也是有__proto__属性的,这是因为prototype本质上也是一个对象的实例,所以js在查找某个属性是否存在的时候会通过__proto__属性一直追踪到object。

图片 7

  1. 如果function中的属性与prototype属性冲突了怎么办?

图片 8

看到答案后,我想你也非常清楚了,毕竟你已经理解了原型链的查找,因为js引擎查找过程是先从本函数查找,如果找到就return,找不到继续通过__proto__往上找,很好理解的。

赞 1 收藏 评论

图片 9

什么是虚拟视窗(virtual viewport)

2015/04/09 · HTML5 · 虚拟视窗

本文由 伯乐在线 - 柒柒 翻译,周进林 校稿。未经许可,禁止转载!
英文出处:updates.html5rocks.com。欢迎加入翻译组。

尽管谷歌新推出的移动浏览器Chrome M40在视窗上做的改变非常微小,但这对用户来说却大有不同。

在启动移动浏览器时,不加视窗元标签的情况下,浏览器的网页大小默认为屏幕实际大小的980px左右,并在此基础上进行渲染。而加上视窗元标签的话,开发人员可以自定义网页宽度,通常设置为“设备宽度”,就是让页面大小自适应于设备的屏幕宽度。详见learn more on Web Fundamentals。

Rick Byers这样描述虚拟视窗:虚拟视窗就是将“视窗”概念分割成两部分,一个是“布局视窗(layout viewpor)”(在这里,所有的内容都处于固定的位置上),另一个是“虚拟视窗(visual viewport)”(用户实际看见的部分)。

用HTML5 Canvas画一张笑脸

2015/02/24 · HTML5 · 2 评论 · Canvas, HTML5

本文由 伯乐在线 - cucr 翻译,JustinWu 校稿。未经许可,禁止转载!
英文出处:code.tutsplus.com。欢迎加入翻译组。

图片 10

今天,你将学习一项称为Canvas(画布)的web技术,以及它和文档对象模型(通常被称为DOM)的关联。这项技术非常强大,因为它使web开发人员能够通过使用JavaScript访问和修改HTML元素。

现在你可能想知道为什么我们需要大刀阔斧地使用JavaScript。简而言之,HTML和JavaScript是相互依存的,一些HTML组件,如canvas元素,并不能脱离JavaScript单独使用。毕竟,如果我们不能在上面绘图,那canvas能派什么用处呢?

为了更好地理解这个概念,我们一起通过一个示例项目来尝试画一个简单的笑脸。让我们开始吧。

超级简单的例子

Vediojs.com这个网站就是个很好的例子,导航栏固定在顶部,并且在其左右两侧都有相关链接。

下面的两排图片对比展示了,对页面进行放大和左右移动时,在两种版本的移动浏览器上分别会发生什么。

上面一排手机用的是Chrome M39,这个版本没有虚拟视窗功能,而底下的三个界面来自拥有虚拟视窗的Chrome M40。

图片 11

图片 12

在Chrome M39中,你放大界面后还能看到导航栏,但是往右挪就看不到导航栏右侧的链接,只能看到网站的logo。

在这点上Chrome M40(拥有“虚拟视窗”)就不一样了,你可以看到“虚拟视窗”在“布局视窗”中滚动所有内容,这样就能在左右滑动时看到导航栏上右侧的链接。

IE浏览器已经拥有此项功能,这些改进让我们的浏览器在功能上和他们的更加贴近。

开始

首先创建一个新目录来保存你的项目文件,然后打开你最喜欢的文本编辑器或web开发工具。一旦你这样做了,你应该创建一个空的index.html和一个空的script.js,之后我们将继续编辑。

图片 13

接下来,我们来修改index.html文件,这不会涉及很多东西,因为我们项目的大部分代码将用JavaScript编写。我们需要在HTML中做的是创建一个canvas元素和引用script.js,这相当直截了当:

XHTML

<!DOCTYPE html><body> <canvas id='canvas' width='640' height='480'></canvas> <script type='text/javascript' src='script.js'></script> </body></html>

1
2
3
4
5
6
<!DOCTYPE html><body>
 
   <canvas id='canvas' width='640' height='480'></canvas>
   <script type='text/javascript' src='script.js'></script>
 
</body></html>

这么解释,我使用一组标记< html >和< body>,这样,我们可以通过body为文档添加更多的元素。抓住这个机会,我完成了一个id属性为canvas的640*480的canvas元素。

这个属性只是简单地为元素加上一个字符串,目的是为了唯一识别,稍后我们将利用这个属性,在JavaScript文件中定位我们的canvas元素。接下来,我们再使用<script>标记引用JavaScript文件,它指定JavaScript的语言类型和script.js文件的路径。

本文由澳门新葡亰平台官网发布于web前端,转载请注明出处:原型也不好理解,Canvas画一张笑脸

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。