【问题标题】:Why adding a method to JavaScript reference type like this doesn't work?为什么像这样向 JavaScript 引用类型添加方法不起作用?
【发布时间】:2016-01-23 00:46:56
【问题描述】:

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

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;
};

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

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

让我困惑的可能是我在 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;
};

现在只有myObject会有这个新方法getFullName,很清楚。

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

对于myObject2没有getFullName方法,还是很清楚的。

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

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

现在即使myObject2,也有getFullName 方法。清除。

好的。我想我正在解决我脑海中问题的根源。扩展这篇文章对我有帮助。

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

【问题讨论】:

  • 我会查看一些讨论其原型继承系统的 JS 教程。
  • @DaveNewton 我做了,但这仍然不清楚,这就是我问的原因。在 Java 方面有一些经验我想向“类”Person.getfullName 添加一个方法会很好。我在任何示例中都没有看到这一点,它不会抛出任何错误,所以它会做一些事情。问题是究竟是什么,它是否有用。
  • 我认为阅读我的回答这个问题会对你有所帮助(这不是重复,只是相关)stackoverflow.com/questions/31630409/…
  • @so_user JS 没有类;我会先克服这个概念上的障碍。一个对象的原型有点像它的类(只是有点);添加到原型的方法将可用于其原型链包含该方法添加到的原型的每个对象。您可能不应该尝试将 JS OOP-ness 与 Java OOP-ness 联系起来;他们使用非常不同的机制。

标签: javascript object constructor


【解决方案1】:

myObject.methodName = function() {}; 将名为methodName 的方法添加到对象myObject。这意味着您可以直接从myObject 调用它,而无需创建实例。

简单地说,您只需这样做即可调用它:

myObject.methodName();

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

你可以这样称呼它:

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

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


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

要更深入地了解这两种方法之间的区别,我建议您查看我的文章The many ways to implement OOP in Javascript

【讨论】:

  • 当涉及到向对象本身或原型添加方法时——我理解。但是在上面的代码中,我向“类”Person 添加了一个方法,而不是实际的对象。当一个方法被添加到类而不是实例化对象时,这让我感到困惑。
  • 我会在阅读完您的文章后回复您。谢谢你的链接。
  • @so_user :在最近添加类 EcmaScript 之前,JavaScript 中没有类。只有函数和对象。无论如何,未启动的对象(您称之为“类”)的行为或多或少类似于 Java 中的单例类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
  • 1970-01-01
  • 2014-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多