javascript:函数和对象...?

您可以将函数称为对象吗? 例如:

function Tip(txt){      
    this.content = txt;  
    this.shown = false;  
}

和:

var tip = new Tip(elem.attr('title'));

我的问题:

  1. 您可以为某个对象调用函数new吗?
  2. 之所以可以使用“ this”,是因为我们将该函数用作对象?
Paul asked 2020-08-03T16:43:20Z
7个解决方案
121 votes

您正在寻找new概念。

JavaScript中的所有函数都是对象,可用于创建对象:

function make_person(firstname, lastname, age) {
    person = {};
    person.firstname = firstname;
    person.lastname = lastname;
    person.age = age;
    return person;
}
make_person("Joe", "Smith", 23);
// {firstname: "Joe", lastname: "Smith", age: 23}

但是,为了创建特定类型的新对象(也就是说,继承原型,具有构造函数等),一个函数可以引用new,如果用new运算符调用该函数,则它将返回一个对象 具有在函数Person上定义的所有属性-make_person_object在这种情况下引用了我们正在创建的新对象。

function make_person_object(firstname, lastname, age) {
    this.firstname = firstname;
    this.lastname = lastname;
    this.age = age;
    // Note, we did not include a return statement
}

newPerson之间要注意的主要区别是,调用make_person_object(而不是make_person())不会做任何不同的事情……两者都会产生相同的对象。 但是,在没有new运算符的情况下调用make_person_object(),将在当前this对象上定义this属性(如果在浏览器中进行操作,则通常为window)。

从而:

var Joe = make_person_object("Joe", "Smith", 23);
console.log(Joe); // undefined
console.log(window.firstname) // "Joe" (oops)

var John = new make_person_object("John", "Smith", 45);
console.log(John); // {firstname: "John", lastname: "Smith", age: 45}

而且,正如@RobG指出的那样,这种处理方式会在我们创建的每个“人员”上创建对Personnew属性的引用。 这使我们能够在事实发生后向人员添加方法和属性:

 // Assuming all that came before
make_person_object.prototype.full_name = "N/A";
make_person_object.prototype.greet = function(){ 
    console.log("Hello! I'm", this.full_name, "Call me", this.firstname); 
};
John.full_name // "N/A"
John.full_name = "John Smith"; 
make_person_object.full_name // Still "N/A"
John.greet(); // "Hello! I'm John Smith Call me John"

习惯上,诸如new之类的构造函数要大写,单数化并“名词化”(因为缺乏更好的用语),因此我们将拥有Person构造函数,而不是make_person_object可能会误认为是普通函数的构造函数。

也可以看看:

  • new运算符
  • bobince对JavaScript子类化的出色介绍(带有和不带有原型继承)。
Sean Vieira answered 2020-08-03T16:44:10Z
19 votes

每个函数都有对2995326392075875813888的引用。如果调用new {},则2995326392075813813890将引用全局对象。 如果调用2995326392075875813891,则会创建一个引用Tip.prototype的新对象,并且Object将引用该新对象。

您不能在对象上使用2995326392092075813888,例如new {}抛出TypeError: object is not a function。如果您引用的是2995326392075875813891,则该函数起作用,因为Object是一个函数。

Adam Bergmark answered 2020-08-03T16:44:35Z
6 votes

是。 在JavaScript中,从技术上讲,一切都是对象。 当您使用new时,它将创建Tip对象的实例,然后调用Tip函数,就好像它是构造函数一样。

如果要向Tip对象添加功能,则应将它们添加到Tip的原型中,如下所示:

Tip.prototype.getContent = function() {
    return this.content;
};

如果有,那么您可以执行以下操作:

var tip = new Tip("this  is my content.");
alert(tip.getContent());

它会显示一条消息,说“这是我的内容”。

但是,如果对象具有功能实现,则只能使用new。 所以这行不通:

var Tip = { content: txt, show: false };
var tipObj = new Tip();
Tom Chandler answered 2020-08-03T16:45:13Z
3 votes

我一直在努力理解这些概念(作为对象的功能,原型对象,__ proto__属性,构造函数属性)的概念(2008-2016年)。首先,在多次阅读第6,8,9章后,我开始了David Flanagan的“ JavaScript权威指南5 / 6th ed”,历时4-5年。这对我来说没有任何意义,但是在互联网上苦苦挣扎后,我可以将某些功能(具有属性的典型C ++功能)作为对象进行管理。因为对象也可以有方法。幸运的是,在2015年第7年,我创建了Wrox Nicholas C. Zakas,“ Web开发人员的专业JavaScript第三版”,第6,7章;理解以上四个概念确实非常有帮助。传统上,在C / C ++ / C#中,函数被认为是修改对象。或者换句话说,它们是为“做某事”而创建的,其中通过更改其自身对象状态的方法来创建对象以维护全局运行上下文的状态。因此,如果函数可以是一流的对象,那么为什么对象不能像函数一样?

这里的主要关键问题应该是为什么?为什么不单个概念实体 像“关联函数”还是“链式参数”?这是我的理解:Browser exe是一个单线程应用程序,该exe控制具有预定义范围链(某些类似于带有参数的命令字符串)的JS解释器的调用;现在,在运行时,JS引擎(非解释器)以提升方式加载代码(因为没有主要方法,因此提升了定义良好的关键字代码及其调用)。在此提升的代码中,如果未将函数视为对象,则必须将它们维护在单独的调用上下文中(不在作用域链中),这在c / c ++ / c#(多线程和无限内存的bcoz)中很容易实现,而在JS中。因此,“对链接对象执行待办事项”使java脚本功能成为第一类对象。实际上,JS对象也做同样的事情。唯一的区别是对象中不存在“调用对象”,因为“调用函数”是链接上下文,这是有意义的。也可以将函数视为“带有地址链接(链)的带有汇编语言指令的变量集”。链接部分是故事的另一面,如顶部->底部链接(原型对象)与底部->顶部链接(__proto__属性)与对象蓝色打印->对象实例(构造函数属性)。几个月前,我发现以下图像有助于理解链接。

[http://judis.me/wordpress/wp-content/uploads/2015/08/JavaScriptDiagram.png]“ JS对象模型”

Saurabh answered 2020-08-03T16:45:46Z
1 votes

对于#1:有一个名为Function(大写F)的对象

var f = new Function(“ x”,“ y”,“返回x * y;”);

对于#2:“此”因调用模式而不同(如道格拉斯·克罗克福德(Douglas Crockford)所称)。 Crockford说有4种模式(方法模式,函数模式,构造函数模式和“应用”模式)

user670800 answered 2020-08-03T16:46:16Z
1 votes

该函数充当类的构造函数。 或者,您可以执行以下操作:

function Tip(txt) {
 return {
 content: txt,
 shown: false
}
}

并获得一个新实例:this类似于c#:

public class Tip {
string text = "";
public Tip(string txt) {
text = txt;
}
}

所以,有点。 1)您正在调用new,因为该函数本质上是充当类,并且2)this引用了该类的当前实例。

Thomas Shields answered 2020-08-03T16:46:45Z
0 votes
  1. 实际上,每个数据类型(如数组,函数)都是对象。
  2. 当我们将函数用作类声明时,此方法有效。
xblymmx answered 2020-08-03T16:47:09Z
translate from https://stackoverflow.com:/questions/5958417/javascript-function-and-object