为什么Array().slice没有“;新的“;工作
Why does Array().slice without "new" work?
从这里开始:
function highest(){
return makeArray(arguments).sort(function(a,b){
return b - a;
});
}
function makeArray(array){
return Array().slice.call( array );
}
assert(highest(1, 1, 2, 3)[0] == 3, "Get the highest value.");
assert(highest(3, 1, 2, 3, 4, 5)[1] == 4, "Verify the results.");
现在,为什么Array()
甚至在没有new
运算符的情况下返回一些有意义的东西?我在JS中看到的大多数"类"定义如果在没有new
:的情况下调用,则返回undefined
function User(name) {
this.name = name;
this.jump = function() {
console.log(name + " is jumping!");
}
}
assert(typeof(User("no New")) == 'undefined');
规范明确规定:
当
Array
作为函数而不是构造函数被调用时,它会创建并初始化一个新的Array
对象。因此函数调用Array(…)
等效于具有相同参数的对象创建表达式new Array(…)
。
如何在内部完成取决于实现,但对于自定义构造函数,您可以使用以下技巧:
if(!(this instanceof User)) return new User(name);
因为new User(...)
将this
设置为创建的User
实例,而User(...)
将其设置为全局对象。(事实上,您在最后一个代码段中设置了全局变量。)
基于Chrome的调试面板,Array()
以与新Array()
或[]
相同的方式返回新数组。我的猜测是,它要么是为了语言的易用性,要么是与[]
语法有关(当然不需要新语法)。
实际上,使用您自己的功能可以选择需要一个新的:
function User(name) {
if (!(this instanceof User)) {
return new User(name);
}
this.name = name;
this.jump = function() {
console.log(name + " is jumping!");
};
}
然后用户('blah')和新用户('lah')都工作。
相关文章:
- Firebase迁移-简单的Firebase.set没有'不再工作了——旧的还是新的
- 新的包装器在JavaScript中是如何工作的
- 将工作表复制到新的电子表格,将单元格值添加到新电子表格名称的末尾
- 新的回顾;I don’在(基本上)同一页上做两次工作
- 新的google.maps.LatLngBounds()绑定扩展和中心工作随机
- Google表格脚本,用于将一张工作表上的几个单元格值传递给新的工作表行
- 为什么一串数字的工作方式与新日期中的实际数字不同
- 使用原型的自定义数组函数.新的 MyArray(1,2,3,4) 不工作
- 为什么 $(':radio').change() 在新的 jQuery 中停止工作
- Facebooks新的全屏照片查看器是如何工作的
- 为什么Array().slice没有“;新的“;工作
- “;新的“;关键字工作,如ECMAScript 5标准中所述
- Javascript不工作在新的引导网站
- Regex——为什么在使用新的RegExp方法时这个模式不能工作?
- 新的hammer.js的手势不像以前那样工作
- 让jQuery在新的WordPress主题中工作
- 为什么我必须重命名我的javascript文件,以获得我的新函数的工作
- 在新的Wordpress PHP文件中访问$wpdb,需要wp-load. PHP;不工作
- 在新的窗口jquery功能不工作
- 脚本谷歌表移动行到新的工作表