簡體   English   中英

Javascript:沒有原型的函數

[英]Javascript : functions without prototype

javascript中的內置函數 (例如Object.keys )沒有“ prototype”屬性。

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

但是, function(){...}new Function()都會生成一個構造函數(Function的實例)以及一個原型(Object的實例)。 太貴了嗎?

是否可以在JavaScript中創建純函數而不是構造 函數

問題是“'創造'它們意味着什么”?

出於所有意圖和目的,

function myFunc ( ) { }

myFunc.constructor = undefined;
myFunc.prototype = undefined;

從實際的角度來看,它將為您提供所需的東西。

在ES6中,lambda不應與其他功能關聯;

(() => { }).prototype === undefined; // I believe this should be 100% true

...您的其他問題... ...為每個功能添加功能/對象是否過於昂貴...

....嗯,有些游戲可以在瀏覽器上愉快地運行。 如今,談論通過執行功能而產生的內存消耗通常很小,(盡管物聯網/可穿戴設備將是一個問題)。
那是過早的微優化。

除了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方式編寫。 您可能需要使用函數原型,因為上面已經為您提供了一些示例,這將進一步闡明您的意圖:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM