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
之间有一个真正的委托还是只是一个简单的复制?
它被称为"原型链",从底部开始,最终向上移动到Object
,这是所有对象类型的基础。
Function
继承了Object原型并拥有自己的原型。因此,当JavaScript解释器看到Function.toString
时,它将首先在Function.prototype
中查找toString
。只有在找不到它的情况下,它才会移动到下一个原型,在这种情况下是Object.prototype
。在你给出的例子中没有调用toString。
对于所有对象属性都是这样做的。需要注意的是,在原型链中每向上走一步,访问该属性所花费的时间就越长,因为解释器总是从底部开始,然后向上运行。每个原型搜索都需要CPU周期,所以最好在你正在访问的对象上有方法或属性,而不是在原型链上有一个通用的方法,比如Object
。
/* 对不起,我不记得它是"向下"还是"向上"的链条,当我找到共同的白话时,会纠正哪个方向的对象。
*/我现在有正确的方向了
- 实现比较方法的最佳实践是什么;s的比较类型是在运行时选择的
- Dynamics 2016内部部署Crm客户端脚本.选项集控件类型缺少方法
- 如何确保函数/方法参数为certian类型
- 在Javascript中调用对象方法时不是函数类型错误
- E4X中是否有一种方法可以将基元数据类型的XMLList转换为类似于Array.join()的Array
- 在输入类型提交按钮上调用 C# 方法
- 处理复杂类型时的声明方法
- JavaScript:创建新对象类型的方法
- 类型错误:对象 #<对象> 没有方法“身份验证”
- 未捕获的类型错误:Wordpress Jquery 幻灯片 - 对象没有方法
- 有没有一种方法可以通过列类型/属性来格式化MySQL单元格数据
- 未捕获的类型错误:无法调用方法'shift'Chrome中的Facebook JS库为null
- 使用each()方法来动画化代码类型
- 未捕获的类型错误:无法调用方法'至小写'的未定义
- 有没有一种方法可以在Typescript中自动检查数据类型的数据相等性
- 未捕获的类型错误:无法调用方法'每个'的未定义
- 未捕获的类型错误:对象#<节点列表>没有方法'addEventListener'
- 模块模式中的私有方法:类型错误:未定义不是一个函数
- 如何查询XMLHttpRequest's方法类型
- 解决打字错误的最佳方法-类型上不存在属性