js原型链
来源:互联网 发布:下载模组的软件 编辑:程序博客网 时间:2024/06/05 17:15
对象
javascript
中的简单数据类型包括数字,字符串,布尔值(true和false),null
值和undefined
值.其他所有的值都是对象.
每一个对象都连接到一个原型对象prototype
,并且它可以从中继承属性.
让我们看一个关于对象的基本例子。一个对象的prototype是以内部的[[Prototype]]
属性来引用的。
但是,在示意图里边我们将会使用__<internal-property>__
下划线标记来替代两个括号,对于prototype对象来说是:__proto__
。
对于以下代码:
var foo = { x: 10, y: 20};
我们拥有一个这样的结构,两个明显的自身属性和一个隐含的__proto__
属性,这个属性是对foo原型对象的引用:
原型链prototype chain
只有在检索值的时候才被用到,如果我们尝试去获取对象的某个属性,但是该对象没有这个属性,那么javascript
会试着从原型对象中获取属性值.
如果那个原型对象也没有该属性,那么再从它的原型中寻找,依次类推,直到该过程最后到达Object.prototype
.
如果在遍历了整个原型链之后还是没有查找到这个属性的话,返回undefined
值。
在ECMAScript中你创建对象:a,b,c。于是,对象a中存储对象b和c中通用的部分。然后b和c只存储它们自身的额外属性或者方法。
var a = { x: 10, calculate: function (z) { return this.x + this.y + z }};var b = { y: 20, __proto__: a};var c = { y: 30, __proto__: a};// call the inherited methodb.calculate(30); // 60c.calculate(40); // 80
如果没有明确为一个对象指定原型,那么它将会使用__proto__
的默认值`Object.prototype`。`Object.prototype`对象自身也有一个__proto__
属性,这是原型链的终点并且值为`null`。
下一张图展示了对象a,b,c之间的继承层级:
函数对象
每个函数对象在创建时也随之分配一个prototype
属性.它的值是一个拥有constructor
属性并且值即为该函数对象.
构造函数
除了以指定模式创建对象之外,构造函数也做了另一个有用的事情-它自动地为新创建的对象设置一个原型对象。这个原型对象存储在ConstructorFunction.prototype
属性中。
换句话说,我们可以使用构造函数来重写上一个拥有对象b和对象c的例子。因此,对象a(一个原型对象)的角色由Foo.prototype
来扮演:
// a constructor functionfunction Foo(y) { // which may create objects // by specified pattern: they have after // creation own "y" property this.y = y;}// also "Foo.prototype" stores reference// to the prototype of newly created objects,// so we may use it to define shared/inherited// properties or methods, so the same as in// previous example we have:// inherited property "x"Foo.prototype.x = 10;// and inherited method "calculate"Foo.prototype.calculate = function (z) { return this.x + this.y + z;};// now create our "b" and "c"// objects using "pattern" Foovar b = new Foo(20);var c = new Foo(30);// call the inherited methodb.calculate(30); // 60c.calculate(40); // 80// let's show that we reference// properties we expectb.__proto__ === Foo.prototype, // truec.__proto__ === Foo.prototype, // true// also "Foo.prototype" automatically creates// a special property "constructor", which is a// reference to the constructor function itself;// instances "b" and "c" may found it via// delegation and use to check their constructorb.constructor === Foo, // truec.constructor === Foo, // trueFoo.prototype.constructor === Foo // trueb.calculate === b.__proto__.calculate, // trueb.__proto__.calculate === Foo.prototype.calculate // true
这张图又一次说明了每个对象都有一个原型。构造函数Foo也有自己的__proto__
,值为Function.prototype
,Function.prototype
也通过其__proto__
属性关联到Object.prototype
。
因此,重申一下,Foo.prototype
就是Foo的一个明确的属性,指向对象b和对象c的原型。
参照
- javascript-the-core
- JS原型链
- JS原型、原型链
- JS-原型、原型链
- JS原型,原型链
- js原型,原型链
- JS原型+原型链
- JS原型和原型链
- JS原型和原型链
- JS原型和原型链
- JS原型和原型链
- js 原型和原型链
- JS 原型与原型链
- JS原型和原型链
- js原型与原型链
- JS原型与原型链
- JS:原型、原型链、继承
- js原型和原型链
- JS原型及原型链
- js---原型与原型链
- 第五届华中区程序设计邀请赛 网络赛Calculation E 【状压dp】
- 几种常见的窗函数
- 线程相关——HandlerThread、IntentService、ResultReceiver:结果接收者、AsyncTask:异步任务、Android中处理线程间通信的方式
- 华为OJ平台练习题
- 关于jsp乱码的一点小分析
- js原型链
- 进程间通信 - 邮槽实现
- spring security:第一个程序
- 最长上升子序列
- js函数调用方式
- [G.E.B] 埃舍尔的作品
- 传说中的oracle的java证书这个样子!
- Hibernate分别使用XML方式与注解方式添加数据
- js闭包