有人能简单解释OOP环境中的方法与函数吗?


当前回答

我知道还有很多人已经回答了,但我发现以下是一个简单而有效的单行答案。虽然它看起来并没有比这里的其他答案好很多,但如果你仔细阅读它,它提供了你需要了解的关于方法与函数的一切。

方法是具有定义的接收器的函数,在OOP术语中,方法是对象实例上的函数。

其他回答

以下是使用JavaScript示例对方法与函数的一些解释:

测试(20,50);是函数定义并用于运行某些步骤或返回可以存储/使用的内容。

您可以重用代码:定义一次代码并多次使用它。您可以多次使用相同的代码和不同的参数,以产生不同的结果。

var x = myFunction(4, 3);   // Function is called, return value will end up in x

function myFunction(a, b) {
    return a * b;          // Function returns the product of a and b
}

var test=something.test();这里test()可以是某个对象的方法,也可以是为内置对象自定义的原型,这里有更多解释:

JavaScript方法是可以对对象执行的操作。JavaScript方法是包含函数定义的属性。

javascript中字符串的内置属性/方法:

var message = "Hello world!";
var x = message.toUpperCase();
//Output: HELLO WORLD!

自定义示例:

function person(firstName, lastName, age, eyeColor) {
    this.firstName = firstName;  
    this.lastName = lastName;
    this.age = age;
    this.eyeColor = eyeColor;
    this.changeName = function (name) {
        this.lastName = name;
    };
}

something.changeName("SomeName"); //This will change 'something' objject's name to 'SomeName'

例如,您还可以为String、Array等定义财产

String.prototype.distance=函数(char){var index=this.indexOf(char);如果(索引==-1){console.log(char+“不出现在”+this中);}其他{console.log(char+“是”+(this.length-index)+“字符串末尾的字符!”);}};var something=“ThisIsSomeString”//现在像这样使用distance,运行并检查控制台日志距离(“m”);

一些参考:Javascript对象方法,函数,原型的更多信息

TL;博士

函数是一段要运行的代码。方法是对象内的函数。

函数示例:


function sum(){
  console.log("sum")l
}

方法示例:

const obj = {
a:1,
b:2,
sum(){
  }
}

所以这就是为什么我们说函数中的“this”关键字不是很有用,除非我们将其与call、apply或bind一起使用。。因为call、apply、bind将作为对象内部的方法调用该函数==>基本上它将函数转换为方法

类是一些数据和函数的集合,可以选择使用构造函数。

在创建该特定类的实例(副本、复制)时,构造函数初始化该类并返回一个对象。

现在类成为对象(没有构造函数)&函数在对象上下文中称为方法。

所以基本上

类<==new==>对象

函数<==new==>方法

在java中,构造函数的名称通常与类名相同,但实际上,构造函数类似于实例块和静态块,但具有用户定义的返回类型(即class类型)

而类可以具有静态块、实例块、构造函数、函数对象通常只有数据和方法。

根据我的理解,方法是可以在类上执行的任何操作。它是编程中使用的通用术语。

在许多语言中,方法由函数和子程序表示。大多数语言用于这些的主要区别是,函数可能会返回一个值给调用者,而子程序可能不会。然而,许多现代语言只有函数,但这些函数可以选择不返回任何值。

例如,假设你想描述一只猫,你希望它能够打哈欠。您将使用Yawn方法创建一个Cat类,这很可能是一个没有任何返回值的函数。

只需两个字:非静态(“instance”)方法将一个隐藏指针指向“this”(作为其第一个参数),该对象就是您调用该方法的对象。

这是与常规独立函数的唯一区别,尽管是动态调度。

如果您感兴趣,请阅读以下详细信息。

我将尽量简短,并将使用C++作为示例,尽管我所说的几乎可以应用于每种语言。

对于您的CPU来说,函数和方法都只是一段代码。时期因此,当调用函数/方法时参数

好吧,我说过没有实际的区别。让我们再深入一点:

有两种类型的方法:静态和非静态静态方法类似于常规函数,但在类内部声明,该类的作用仅类似于命名空间非静态(“instance”)方法采用指向“this”的隐藏指针。这是与常规独立函数的唯一区别。

撇开动态调度不谈,这意味着它非常简单:

class User {
    public string name; // I made it public intentionally

    // Each instance method takes a hidden reference to "this"
    public void printName(/*User & this*/) {
        cout << this.name << endl;
    }
};

相当于

public getName(User & user) {
    // No syntactic sugar, passing a reference explicitly
    cout << user.name << endl;
}

因此,本质上,user->printName()只是getName(user)的语法糖。

如果不使用动态调度,仅此而已。如果使用了它,那么它就有点复杂了,但是编译器仍然会发出一个看起来像函数的东西,将其作为第一个参数。