为什么在这样的JavaScript引用类型中添加方法并不起作用?

时间:2016-01-23 00:46:56

标签: javascript object constructor

我们说我有这样的构造函数:

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

我不知道为什么我会被投票,所以如果downvoters会根据downvote的实际原因添加评论,我将不胜感激。这将有助于我更好地表达我未来的问题。

我确实理解了原型设计背后的继承概念。至少在初级水平的教程,文章和书籍中显示的程度。

让我感到困惑的可能是我在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也是一个对象,对吗?

1 个答案:

答案 0 :(得分:0)

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的有效方法。背后有一个不同的概念。

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