JavaScript 中的简单类型方法委托
Delegation of simple type methods in JavaScript
我目前正在深入研究 JavaScript 中非常好的对象委托原型。据我了解,简单类型(数字、字符串和布尔值)以及函数和数组从 Object.prototype
中获取它们的基本方法。一个很好的例子是 toString
方法。由于 JavaScript 对象的可变性,可以更改这些方法。同样由于它的动态特性,这些更改将立即适用于链接到 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.prototype
和 Function.prototype
之间是否存在真正的委托或只是一个简单的副本?
它称为 "Prototype chain",从底部开始,最终向上移动到 Object
,这是所有对象类型的基础。
Function
继承了Object原型,有自己的原型。所以当 JavaScript 解释器看到 Function.toString
时,它会首先在 Function.prototype
中寻找 toString
。只有找不到它才会移动到下一个原型,在本例中是 Object.prototype
这就是为什么在您给出的示例中没有调用 Object.toString 的原因。
这是针对所有对象属性完成的。重要的是要注意,随着原型链的每一步,您访问 属性 所需的时间就越长,因为解释器将始终从底部开始并向上工作。每个原型搜索需要 CPU 个周期,因此最好在您正在访问的对象上使用方法或 属性,而不是在原型链上使用一个通用方法,例如 Object
。
/* 对不起,我不记得是"down"还是"up"链,当我找到对象是哪个方向的通用白话时会更正。 */
我现在有了正确的方向
我目前正在深入研究 JavaScript 中非常好的对象委托原型。据我了解,简单类型(数字、字符串和布尔值)以及函数和数组从 Object.prototype
中获取它们的基本方法。一个很好的例子是 toString
方法。由于 JavaScript 对象的可变性,可以更改这些方法。同样由于它的动态特性,这些更改将立即适用于链接到 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.prototype
和 Function.prototype
之间是否存在真正的委托或只是一个简单的副本?
它称为 "Prototype chain",从底部开始,最终向上移动到 Object
,这是所有对象类型的基础。
Function
继承了Object原型,有自己的原型。所以当 JavaScript 解释器看到 Function.toString
时,它会首先在 Function.prototype
中寻找 toString
。只有找不到它才会移动到下一个原型,在本例中是 Object.prototype
这就是为什么在您给出的示例中没有调用 Object.toString 的原因。
这是针对所有对象属性完成的。重要的是要注意,随着原型链的每一步,您访问 属性 所需的时间就越长,因为解释器将始终从底部开始并向上工作。每个原型搜索需要 CPU 个周期,因此最好在您正在访问的对象上使用方法或 属性,而不是在原型链上使用一个通用方法,例如 Object
。
/* 对不起,我不记得是"down"还是"up"链,当我找到对象是哪个方向的通用白话时会更正。 */
我现在有了正确的方向