内置函数(例如Object.keys
)没有"原型"属性。
Object.keys.prototype === undefined; // returns true
Array.prototype.slice.prototype === undefined; // returns true
但是,function(){...}
或new Function()
将生成构造函数(Function的实例)以及原型(Object的实例)。它不是太贵了吗?
是否可以在javascript中创建纯函数而不是构造函数?
答案 0 :(得分:2)
问题是“创造'他们意味着什么'是什么意思?”
出于所有意图和目的,
function myFunc ( ) { }
myFunc.constructor = undefined;
myFunc.prototype = undefined;
从实际的角度来看,可以满足你的需求。
在ES6中,lambdas应该与其他函数无关;
(() => { }).prototype === undefined; // I believe this should be 100% true
...你的另一个问题......是否为每个功能添加了添加的功能/对象太昂贵了......
....好吧,有些游戏在浏览器上运行愉快。如今,谈论制作功能时的内存消耗通常是不可估量的(尽管物联网/可穿戴设备会受到关注)。 那是一个过早的微观优化。
答案 1 :(得分:2)
除了Math.random
之外,JS中的内置函数是纯粹的设计。你不应该使用new
语句派生一个函数,它不会为你做正确的工作。
JavaScript是一种多范式编程语言,它公开了functional
和oop
两种感官。所以,你有没有原型的纯函数:
Math.round // whose typeof is function
Math.floor // whose typeof is also function
上面,Math
可以被视为命名空间而不是对象类型。所以它只是一个为您提供一系列功能的容器。
相反,如果你在JavaScript中引用原型对象的函数,除非你通过原型引用它们,否则你将得到一个未定义的东西:
Array.map // undefined
Array.reduce // undefined
这是因为 Array不是像Math这样的名称空间,它是OOP意义上的一类对象。所以你需要通过它的实例调用这个函数:
var list = new Array(3);
list.map(function(a){ return 1 });
否则,您可以通过prototype
引用该函数来访问未绑定this
对象的纯函数。见以下声明:
var list = [1,2,3];
typeof(Array.prototype.map); // It's pure, unbound
Array.prototype.map.call( list, function(a){ return a*2 }); // Usage in a purely-functional way
这背后的意义是,JavaScript被设计为可以在OOP和Functional方式下写入。您可能需要使用函数原型,因为我已经给出了上面的一些示例,这将进一步澄清您:)
答案 2 :(得分:-1)
在没有new