JavaScript

时间:2015-08-22 07:08:42

标签: javascript types delegation

我正在深入研究JavaScript中对象的非常好的原型委派。据我所知,简单类型(数字,字符串和布尔值)以及函数和数组从Object.prototype委派基本方法。一个很好的例子是toString方法。由于JavaScripts对象的可变性,因此可以更改这些方法。同样由于它具有动态性质,这些更改将立即可用于链接到Object.prototype的所有原型。

以下是动态原型链接应如何工作的基本示例:

var myFirstObject = {
  myMethod: function () {
    console.log('this is the method from myFirstObject');
  }
},

mySecondObject = Object.create(myFirstObject);
mySecondObject.myMethod(); // "this is the method from myFirstObject"

myFirstObject.myMethod = function () {
  console.log('this is a dynamic change of myMethod from myFirstObject');
};

mySecondObject.myMethod(); // "this is a dynamic change of myMethod from myFirstObject"

mySecondObject.myMethod = function () {
  console.log('this is the method from mySecondObject')
};

mySecondObject.myMethod(); // "this is the method from mySecondObject"

delete mySecondObject.myMethod;

mySecondObject.myMethod(); // "this is a dynamic change of myMethod from myFirstObject"

然而,对于像toString这样的默认方法,这似乎没有预期的效果:

var myFunction = function () {};

Object.prototype.myCustomMethod = function () {
  console.log('This is a custom function on the Object prototype');
};

myFunction.myCustomMethod(); // "This is a custom function on the Object prototype"

Object.prototype.toString = function () {
  console.log('Don\'t mess around with the Object prototype default methods');
}

myFunction.toString(); // "function () {}" <-- ???

Function.prototype.toString = function () {
  console.log('Don\'t mess around with the Function prototype default methods');
};

myFunction.toString(); // "Don't mess around with the Function prototype default methods"

delete Function.prototype.toString;

myFunction.toString(); // "Don't mess around with the Object prototype default methods" <-- ???

所以我的问题是:toString这样的默认方法会发生什么样的魔术?Object.prototypeFunction.prototype之间是否存在真正的授权?或者只是一个简单的副本?

1 个答案:

答案 0 :(得分:0)

它被称为“原型链”并从底部开始并最终向上移动到Object,这是所有对象类型的基础。

Function继承了Object原型并拥有自己的原型。因此,当JavaScript解释器看到Function.toString时,它会首先在toString中查找Function.prototype。只有当它找不到它才会移动到下一个原型,在这种情况下是Object.prototype这就是你在给出的例子中没有调用Object.toString的原因。

这是针对所有对象属性完成的。重要的是要注意,原型链的每一步都需要更长的时间来访问该属性,因为解释器总是从底部开始并进行处理。每个原型搜索都需要CPU周期,因此最好在您正在访问的对象上使用方法或属性,而不是在原型链的后面有一个常用方法,例如Object

/ * 抱歉,我不记得它是“向下”还是“向上”链条,当我找到对象所针对的常用白话时,它会更正。 * /

我现在有正确的方向。