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原型对象的引用:
__proto__

原型链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之间的继承层级:
__proto__

函数对象

每个函数对象在创建时也随之分配一个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

constructor
这张图又一次说明了每个对象都有一个原型。构造函数Foo也有自己的__proto__,值为Function.prototypeFunction.prototype也通过其__proto__属性关联到Object.prototype
因此,重申一下,Foo.prototype就是Foo的一个明确的属性,指向对象b和对象c的原型。

参照

  • javascript-the-core
  • JS原型链
0 0