gpt4 book ai didi

javascript - 同时是一个函数和一个对象?

转载 作者:数据小太阳 更新时间:2023-10-29 03:49:11 24 4
gpt4 key购买 nike

是否有可能在创建一个函数变量之后,您实际上可以为它分配属性,就好像它是一个普通对象一样?这就是我所做的:

var example = function(a, b){
console.log(a, b);
}
example.someProperty = 'hi there';

然后我在浏览器控制台中输入了这些行:

example('Hello', 'world') // Hello world
example.someProperty // hi there

所以现在“示例”var 基本上同时充当函数和对象。这对我提出了一些问题,其中一个是为什么,另一个是有没有办法通过创建对象字面量来做到这一点,因为我想不出这样的方法。

最佳答案

So now basically the 'example' var acts as a function and as an object at the same time.

它不充当一个函数和一个对象,它一个函数和一个对象。函数是 JavaScript 中的对象。

This raised some questions for me, one of which is why

从根本上说,因为那是 Eich 在 1995 年 5 月的那 10 天里决定做的事情。为什么他决定这样做只有他能回答,但多年来有许多语言也认为没有理由将函数视为特殊的东西和不同的。想必他也受到了这些影响。函数是合适的对象是非常方便和灵活的。例如:

function foo() {
// ...
}
var f = foo;

我可以使用变量 f 来引用 foo 因为 foo 是一个对象。在许多语言中,例如 Java,这样做真的很痛苦(尽管 Java 现在好一些,这要归功于其最近添加的 lambda)。

由于函数是对象,它们有原型(prototype),这意味着我可以向所有 函数添加功能。例如:我发现能够接受一个函数并“融入”(或“curry”)参数非常方便:

// A simple function
function foo(a, b) {
console.log("a is " + a);
console.log("b is " + b);
}

// Create a new one that, when called, will call the original passing in
// 1 as the first argument and then passing in any further arguments,
// preserving the `this` it was called with
var f = foo.curry(1);

// Call it
f(2); // "a is 1" / "b is 2"

由于 JavaScript 没有 curry 函数(它有 bind,这很相似,但会干扰 this),我可以加一个:

var slice = Array.prototype.slice;
Object.defineProperty(Function.prototype, "curry", {
value: function() {
var f = this;
var args = slice.call(arguments);
return function() {
return f.apply(this, args.concat(slice.call(arguments)));
};
}
});

瞧,现在我可以在任何函数上使用 curry:

var slice = Array.prototype.slice;
Object.defineProperty(Function.prototype, "curry", {
value: function() {
var f = this;
var args = slice.call(arguments);
return function() {
return f.apply(this, args.concat(slice.call(arguments)));
};
}
});

// A simple function
function foo(a, b) {
snippet.log("a is " + a);
snippet.log("b is " + b);
}

// Create a new one that, when called, will call the original passing in
// 1 as the first argument and then passing in any further arguments,
// preserving the `this` it was called with
var f = foo.curry(1);

// Call it
f(2); // "a is 1" / "b is 2"
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

is there a way to do this by creating an object literal

不,创建函数的唯一方法是从函数开始。您不能将非函数对象变成函数。

关于javascript - 同时是一个函数和一个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33097986/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com