Lar*_*ehm 3 javascript jquery mootools prototypejs
介绍
我们都知道argumentsJavaScript函数的这些愚蠢对象.
但为什么反对呢?不是阵列吗?
不,这不是,这就是为什么许多人称之为JavaScripts概念的失败:
(function () {
return arguments.slice(); // TypeError: arguments.slice is not a function
}());
Run Code Online (Sandbox Code Playgroud)
意向
好的,这只是我要问的真实内容的介绍,但在问你需要更多信息之前:
虽然在最后几天阅读不同的代码,但在很多地方看到以下代码行时我感到非常伤心.
args = Array.prototype.slice(arguments);
Run Code Online (Sandbox Code Playgroud)
那么,它做了什么,只是简单地将arguments对象"转换" 成一个包含所有原型和东西的数组.
我的解决方案
我想到的是以下内容:虽然JavaScript完全是关于原型设计的,但为什么我们不扩展arguments对象prototype本身呢?我检查了一些网站的现有脚本,但没有发现我打算找到的东西,最后我自己写了:
(function () {
var i, methods;
arguments.constructor.prototype = Array.prototype;
methods = ['concat', 'join', 'pop', 'push', 'reverse', 'shift', 'slice', 'sort', 'splice', 'toString', 'unshift'];
for (i = 0; i < methods.length; i += 1) {
if (arguments.constructor.prototype.hasOwnProperty(methods[i]) === false) {
arguments.constructor.prototype[methods[i]] = Array.prototype[methods[i]];
}
}
}());
Run Code Online (Sandbox Code Playgroud)
压缩后,它只需要260个字节,并通过使用扩展arguments对象.prototypeArray.prototype
所以最后我可以arguments像"真正的"数组一样处理对象.
这个问题
在检查了最着名的JavaScript框架之后,我完成了以下操作:none使用这样的构造并扩展arguments对象的prototype.
但为什么?有什么不对,我现在没想到?
的arguments对象是不是类型,它是一个通用Object.为了扩展它的原型,你必须扩展原型Object,这通常不是一个好主意.
使用转换arguments为数组没有任何问题Array.prototype.slice.
假设我要扩展arguments原型:
arguments.constructor.prototype.foo = 'bar';
Run Code Online (Sandbox Code Playgroud)
这里的问题是,这arguments.constructor不是一些Argument对象,只是Object.现在,如果我尝试做一些应该正常工作的事情,那就是fubar'd:
var someNewObject = {
someProperty: 'someValue'
};
for (var item in someNewObject) {
console.log(item); // logs someProperty AND foo, not good
}
Run Code Online (Sandbox Code Playgroud)
你可以在这里看到这个.
| 归档时间: |
|
| 查看次数: |
2164 次 |
| 最近记录: |