快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

万博app体育游戏注册_酒文化网进入



当我第一次进修Javascript的工具模型时,我的反映时利诱。由于这是我第一次打仗基于原型的说话,以是我完完全全被原型弄得糊里糊涂(译者语:在看这篇文章前,我不停利诱function的prototype和object的__proto__的差别及它们之间的关系)。我不能理解JavaScript经由过程构造函数(function constructors)的要领来实现一种独特的原型。我信托你们傍边也有类似经历的人。

但跟着自己写得越来越多javascript,我不仅理解了它的工具模型而且已经开始爱好上它了。谢谢Javascript我发明基于原型的说话的雅致与机动。我现在十分爱好基于原型的说话,由于它有比基于类的说话更简单和机动的对性模型。

1. Prototypes in Javascript

大年夜多半教程多会在直接经由过程讲述构造函数(constructor functions万博app体育游戏注册)来解说Javascript的工具。我并不认同这种做法,这样只会令到我们更利诱。以是下面我们先进修一些根基的原型吧万博app体育游戏注册!

2. Prototype chains(prototype inheritance)原型链/原型承袭

Javascript的每个工具均有一个原型(prototype)。当消息(哀求某个属性的指令)到达某个工具时,Javascript会考试测验在该工具上探求该属性,但没有的时刻就会将消息转发到该工具的原型并在原型上探求该属性,便是这样赓续向上层原型转发消息,直到在某个原型中找到该属性或消息转发到顶层原型(Object工具)。(译者语:每个工具的原型均指向另一个工具,最顶层的原型便是Object类的实例)

原型承袭链可以无限延长。但一样平常环境下过长的原型链会令人利诱且难以掩护。

3.The __proto__ object

我们可以经由过程__proto__属性来简化对Javascript原型的理解。但不幸的是__proto__属性并非Javascript的标准接口。以是我们不应该在临盆情况中依附该属性。我看一看下面的代码片段吧!

可以看到经由过程工具的__proto__属性我们可以简单、方便地设置工具的原型。

下面我们经由过程isPrototypeof函数来判断父、子类的关系

4. Prototype lookups are dynamic(原型变更的即时性)

你可以在任何光阴添加属性到工具的原型中,然后就能顿时经由过程工具来获取该属性。(译者语:由于正如2. Prototype chains(prototype inheritance)原型链/原型承袭讲述那样,消息是在原型链通报并在原型中探求该属性,所以为原型增编削了属机能即时反应出来)

5. New/updated properties are assigned to theobject, not to the prototype(增改工具的属性)

看代码吧!

(译者语:在工具中已找到了响应的属性,那么就不会将消息转发到原型去)

6. Object.create

前面已经说过__proto__属性并非设置原型的标准措施。下面我们应用Object.create措施来创建工具并指定该工具的原型。该措施在ES5中可用,但老的浏览器和JS引擎要经由过程es5-hhim来应用了。

(译者语:我们以致可以经由过程object.create(null)创始建一个没有原型的工具;而应用其他要领创建的工具它的原型链中至少有一个Object类实例)

当然在创建工具的时刻,还可以设置该工具的属性。

这里盘算展开工具属性设置方面的几个特点的应用措施,大年夜家可以参考相关的文档 here。

7. Object.getProtype

我们可以经由过程Object.getPrototypeOf来获取工具的原型

8万博app体育游戏注册.Constructor Functions(构造函数)

构造函是javascript顶用于构造原型链的最常用的措施。由于它是构造类型的独一的原始要领。而很对javascript引擎对构造函数也供给了机能上的优化。

与此同时,构造函数是javascript中一个紧张且轻易令人疑心的常识点。

8.1. Functions as contructors

我们经由过程关键字new来创建Foo函数的实例foo

8.2万博app体育游戏注册. 'this' is assigned implicitly(隐式分配的this)

当我们应用关键字new创建函数实例时,Javascript会隐式地创建一个this工具,并在函数的着末返回该this工具。

相称于

留意:这个隐式创建的this工具,当且仅当应用关键字new创建函数实例时呈现,若不应用关键字new就会就会呈现弗成预知的问题,一样平常环境下为以首字母大年夜写的要领来命名构造函数,以提示需应用关键字new来调用该函数。

8.3. The 'function prototype'

每一个Javascript的函数都有一个名为prototype的属性(译者语:这个prototype属性与之前说__proto__一样会指向原型,它们之间的关系下面的内容会有所解说。由于prototype这个属性名称的中文便是为原型,所以为了区分下面的内容会用“prototype属性”来代表function的prototype属性)

这个prototype属性与之前说__proto__一样会指向原型,但两者指向的原型又有所差别,详细请看

(译者语:这里原文的代码息争说有问题,据本人实践所得,工具并没有prototype属性,若要造访工具的原型必要应用__proto__属性或Object.getPrototype函数;而要造访函数的原型则要经由过程造访prototype属性。而上述代码的无论foo是工具照样函数均有一方必为undefined,对照结果铁定为false。下面代码片段可以证实两者指向相同的原型:

function Foo(){}

var foo = new Foo();

Object.getPrototype(foo) === Foo.prototype; // => true

且原型为Foo {},该原型的原型为Object {};Foo{} 中有constructor属性指向function Foo(){}自身。)

__proto__和prototype属性的关系着实很简单,prototype属性所指向的原型会在应用关键字new调用构造函数时被复制到隐式创建的this工具的__proto__中。以是prototype属性指向的原型有那些属性和措施,那么__proto__就有哪些属性和措施。

英文原文地址:http://sporto.github.com/blog/2013/02/22/a-plain-english-guide-to-javascript-prototypes/?utm_source=javascriptweekly&utm_medium=email

转自:http://www.cnblogs.com/fsjohnhuang/archive/2013/03/04/2942万博app体育游戏注册274.html

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: