Javascript:没有原型的函数

时间:2015-05-31 03:30:27

标签: javascript function prototype

javascript中的

内置函数(例如Object.keys)没有"原型"属性。

Object.keys.prototype === undefined;             // returns true
Array.prototype.slice.prototype === undefined;   // returns true

但是,function(){...}new Function()将生成构造函数(Function的实例)以及原型(Object的实例)。它不是太贵了吗?

是否可以在javascript中创建纯函数而不是构造函数

3 个答案:

答案 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是一种多范式编程语言,它公开了functionaloop两种感官。所以,你有没有原型的纯函数:

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

的情况下调用它时,它是一个纯函数