为什么像这样向 JavaScript 引用类型添加方法不起作用

Why adding a method to JavaScript reference type like this doesn't work?

本文关键字:添加 方法 不起作用 引用类型 JavaScript 像这样 为什么      更新时间:2023-09-26

假设我有这样的构造函数:

function Person(firstName, lastName) {
   this.firstName = firstName;
   this.lastName = lastName;
}

我想向它添加方法。

为什么会这样:

Person.prototype.getFullName = function() {
    return this.firstName + " " + this.lastName;
};

是这样做的方法,而不是这个:

Person.getFullName = function() {
    return this.firstName + " " + this.lastName;
};

我不知道为什么我被投了反对票,所以如果反对者能添加带有反对票实际原因的评论,我将不胜感激。这将帮助我更好地表达我未来的问题。

我确实在某种程度上理解原型背后的继承概念。至少在初学者级别的教程、文章和书籍中显示的程度。

让我感到困惑的可能是我在 Java 和类术语方面的背景,这在 JavaScript 中不是一回事。

我想这定义了一类Person

function Person(firstName, lastName) {
   this.firstName = firstName;
   this.lastName = lastName;
}

当我使用该类创建对象时:

var myObject = new Person("John", "Doe");

我仍然可以向该对象添加一些新的属性或方法:

myObject.getFullName = function() {
    return this.firstName + " " + this.lastName;
};

现在只有myObjectgetFullName这种新方法,非常清楚。

var myObject2 = new Person("Daniel", "Cook");

对于myObject2没有getFullName方法,仍然很清楚。

一旦我将一个方法添加到我的"类"原型中Person它将被使用该"类"创建的所有对象继承:

Person.prototype.getFullName = function() {
    return this.firstName + " " + this.lastName;
};

现在甚至myObject2,也有getFullName方法。清楚。

还行。我想我正在脑海中找到问题的根源。扩展这篇文章帮助了我。

函数Person也是一个对象,对吧?

myObject.methodName = function() {};

一个名为 methodName 的方法添加到对象myObject 中。这意味着您可以直接从myObject调用它,而无需创建实例。

简单地说,你只需通过这样做来调用它:

myObject.methodName();

myObject.prototype.methodName = function() {};将一个名为 methodName 的方法添加到对象myObject的原型中。这意味着它存在于myObject的每个实例中,但你不能直接从myObject调用它。

你通过这样做来调用它:

var someInstance = new myObject();
someInstance.methodName();

在这种情况下,myObject.methodName();将生成错误!


两者都是在 JavaScript 上实现object的有效方法。它们背后只是有不同的概念。

为了更深入地了解这两种方法之间的区别,我建议您查看我的文章 在 Javascript 中实现 OOP 的多种方法