普通函数和函数对象的区别

Javascript Difference between normal function and function object

本文关键字:函数 区别 对象      更新时间:2023-09-26

在Javascript中创建类(或对象)的方法是使用;

function MyObj()
{
    this.someVar = "xyz";
    this.someMethod = function(){}
}

我的简单问题是这个函数与普通JavaScript函数有何不同…假设一个函数将两个数相加?

功能没有区别。区别在于你如何称呼他们。

例如,它们具有相同的效果:

function MyObj(){
    this.someVar = "xyz";
    this.someMethod = function(){
        console.log(this.someVar);
    }
}
var obj = new MyObj();
obj.someMethod();

function someMethod(){
    console.log(this.someVar);
}
function MyObj(){
    this.someVar = "xyz";
}
var obj = new MyObj();
someMethod.call(obj);

function someMethod(){
    console.log(this.someVar);
}
function MyObj(){
    this.someVar = "xyz";
}
var obj = new MyObj();
obj.f = someMethod;
obj.f();

当您将问题标记为原型继承时,我将说构建函数的最佳方法应该是这样的:

function MyObj(){
    this.someVar = "xyz";
}
MyObj.prototype.someMethod = function(){
    console.log(this.someVar);
}
var obj = new MyObj();
obj.someMethod();

这样,MyObj的所有实例共享相同的函数,因此更轻。

区别不在于函数的内容,而在于如何调用它。

如果调用var myObj = new MyObj(),则创建一个新对象。按照惯例,像这样使用的函数以大写字母开头。

如果你要调用没有new关键字的函数,那么完全相同的事情发生在函数内部,除了this将是全局对象而不是新创建的对象。对于一个简单的"加2个数"函数来说,这并不重要,但如果你忘记了它,就会导致非常奇怪的bug。

确保忘记new调用也没关系的一种方法是将其放在函数的顶部:

function MyObj() {
     if (! (this instanceof MyObj)) {
         return new MyObj();
     }
     ...
}

无。重要的是new关键字的使用。

看到:

function Fun(){
    this.method = function(){
        return "Bar";
    }
    return "Foo";
}
var value = Fun(); // assigns the return value of Fun() to value
alert(value); // "Foo"
// alert(value.method()); // won't work because "Foo".method doesn't exist
var instance = new Fun(); // assigns a new instance of Fun() to instance
alert(instance); // [object Object]
alert(instance.method()); // "Bar"