javascript:功能和对象......?

Pau*_*aul 42 javascript function object

你能把一个函数称为对象吗?例如:

function Tip(txt){      
    this.content = txt;  
    this.shown = false;  
}
Run Code Online (Sandbox Code Playgroud)

和:

var tip = new Tip(elem.attr('title'));
Run Code Online (Sandbox Code Playgroud)

我的问题:

  1. 你可以调用new一个函数吗?
  2. 使用"this"是可能的,因为我们使用该函数作为对象?

Sea*_*ira 121

你正在寻找这个constructor概念.

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}
Run Code Online (Sandbox Code Playgroud)

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

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

关键的区别之间注意make_personmake_person_object是调用new make_person()(而不是简单地make_person())不会做任何不同......都将产生相同的对象.但是,在make_person_object()没有new操作员的情况下调用将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}
Run Code Online (Sandbox Code Playgroud)

此外,正如@RobG指出的那样,这种做事方式创建了对我们创建的每个"人" 的prototype属性的引用make_person_object.这使我们能够在事后添加方法和属性:

 // 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"
Run Code Online (Sandbox Code Playgroud)

公约认为构造函数make_person_object是大写的,单一化的和"被弄明的"(因为没有更好的术语) - 因此我们会有一个Person构造函数,而不是一个make_person_object可能被误认为普通函数的构造函数.

也可以看看:

  • 你遗漏了最重要的部分:构造函数的`this`引用的新对象继承了构造函数原型的属性. (6认同)
  • @RobG - 我*做了*!我已经更新了答案,包括一些这方面的例子 - 感谢帮助它变得更好! (2认同)

Ada*_*ark 19

每个函数都有引用this.如果你调用Tip(),this将引用全局对象.如果调用new Tip(),则会创建一个引用Tip.prototype的新对象,并this引用该新对象.

您不能new在对象上使用,例如new {}throws TypeError: object is not a function.如果您正在引用new Object()那么可行,因为它Object是一个函数.


小智 6

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

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

Tip.prototype.getContent = function() {
    return this.content;
};
Run Code Online (Sandbox Code Playgroud)

如果你有,然后你做:

var tip = new Tip("this  is my content.");
alert(tip.getContent());
Run Code Online (Sandbox Code Playgroud)

它会显示一条消息"这是我的内容".

但是,如果对象具有功能实现,则只能使用new.所以这不起作用:

var Tip = { content: txt, show: false };
var tipObj = new Tip();
Run Code Online (Sandbox Code Playgroud)