gpt4 book ai didi

javascript - 具有对象属性的函数的新实例

转载 作者:行者123 更新时间:2023-11-29 15:34:11 25 4
gpt4 key购买 nike

函数是 JavaScript 中的一流对象 - 但如何将其与 new 结合使用?

我知道如何制作一个既像函数又像对象的对象

fetch.proxy = '127.0.0.1'
fetch(url)

但我想弄清楚如何将其与创建实例结合起来,以便我可以按照以下方式做一些事情:

a = new Fetch(host, username) 

a(path1) // fetches username@host/path1

a(path2) // fetches username@host/path2

(不是很有用的示例,只有 1 个实例)

以下方法不起作用,因为应用 new 会返回一个对象(所以得到 TypeError: object is not a function)。

var Fetch = function(a, b){

if ( (this instanceof arguments.callee) ){
//called as constructor
this.host = a
this.username = b;
this.host = 'localhost'

} else {

//called as function
console.log("Fetching "+this.username+'@'+this.host+a);
}
};

a = new Fetch('host', 'username')

a('/path1') // TypeError: object is not a function

a('/path2') // TypeError: object is not a function

我一直在玩基于 http://tobyho.com/2010/11/22/javascript-constructors-and/Fetch.prototype.constructorWhat it the significance of the Javascript constructor property?但必须承认我已经开始质疑它是否可能。

你有什么好的想法吗?

最佳答案

how to use that in combination with new?

这样做没有意义。所有这些 new Foo所做的是创建一个继承自 Foo.prototype 的新对象.然而,目前不可能让一些函数继承自原型(prototype)而不是 Function.prototype。 , 所以使用 new Something 没有优势创建一个函数。


因为您没有使用 prototype在您的示例中,这并不重要。只需从 Fetch 返回一个函数:

var Fetch = function(host, username){
function fetch(path) {
console.log("Fetching " + fetch.username + '@' + fetch.host + path);
}
fetch.username = username;
fetch.host = host;
return fetch;
};

现在您可以调用Fetch有或没有new **,没有区别:

var a = Fetch(host, username);
// same as
var a = new Fetch(host, username);

请注意,我更改了 this.usernamefetch.username在上面的例子中。每个函数都有自己的 this默认情况下引用函数实例本身的值,所以this.username行不通。

这将允许在创建后通过 a.username = 'something else'; 更改主机或用户名等。如果您不想这样,只需更改 fetch.usernameusername .


**:如果函数显式返回一个对象,那么new将返回该值而不是新创建的继承自 Fetch.prototype 的对象.

关于javascript - 具有对象属性的函数的新实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31290361/

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