将函数和属性附加到对象的用例

3
什么情况下需要将函数和属性附加到对象?我从未在生产中见过这样做。这被认为是一种不好的做法吗?
例如:
var actor = function() {
    console.log('I\'ll be back!');
}

actor.name = 'Arnold Schwarzenegger';

function.property=x 只是在函数对象上存储属性值。当您想要为函数添加特定变量时,它非常有用。与使用一般变量如 var name 不同,使用 actor.name 更易读,并将变量范围限制在函数下。而且,在我看来,这并不是不良实践。 - Koby Douek
1
这实际上是相当基础的内容。对象具有方法和属性。https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Working_with_Objects - JJJ
看一下 jQuery 的源代码,它使用了函数的“双重性质”。也就是说,$ 实际上被定义为一个函数,而不是一个对象,但仍具有许多属性和方法。 - Teemu
1
脚本实际上不起作用。函数.name是只读的,尝试设置它应该会导致错误。使用严格模式! - Bergi
1个回答

1

函数继承自对象。 Function.name 是一个特殊的属性,用于指代函数的名称。对于匿名函数,您可以将 name 属性更改为任何您想要的内容。

更改 .name 是一种好的做法吗?

我认为不是。更改 .name 属性除了让事情更加混淆外,没有实现任何其他目的。

你的问题

将函数和属性都附加到对象上

这不是您的代码正在做的事情。 actor 是一个函数,也是一个对象。您可以向任何对象添加属性,除了 null。事实上,Function.prototype 已经带有许多方法(属性),如 ES6 中所定义。

向函数实例添加属性

通常情况下,向函数实例添加属性并不是一种坏习惯。这种做法在各个地方都被使用,从创建静态方法到 jQuery 中都可以看到(例如:$.get):

function Person(name){
    this.name = name;
}

Person.clone = function(p){
    return new Person(p.name);
};

var p1 = new Person("Alex"),
    p2 = Person.clone(p1);       // clone p1

这是一种语言特性,如果符合您的目的,您应该一定使用它。


当你说这不是一个好的做法时,你特别指的是.name属性,对吗? - Bergi
是的。在我看来,更改函数实例的名称属性通常不是一个好的做法。 - Derek 朕會功夫
1
我同意,我只是不确定OP是否想要问一个关于函数对象属性的通用问题,只是选择了一个非常糟糕的例子。 - Bergi
@Bergi澄清了我的回答。 - Derek 朕會功夫

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接