2
var Ninja = function() {
   this.swingSword = function() {
       return true
   }
}
Ninja.swingFire = function() {
   return true
}

var ninja = new Ninja()
assert(ninja.swingFire()) // undefined

所以它正在创建一个新的 Ninja 对象,但是为什么在这种情况下不包括 swingFire 呢?有人可以解释为什么吗?

4

2 回答 2

8

使用创建的实例new将继承自constructor.prototype,而不是构造函数对象本身。这将如你所愿:

Ninja.prototype.swingFire = function() {
   return true;
}
于 2013-10-08T19:23:50.700 回答
1

如果你想知道 Javascript 中的对象、函数、“类”和继承是如何工作的,你应该看看这个视频:

面向对象 JavaScript 权威指南:http: //youtu.be/PMfcsYzj-9M

这是我见过的对 JS 中面向对象的最好解释。

在您的情况下,会发生以下情况:

当您创建一个new Ninja()时,您将创建一个新的空对象 ( {}),其原型属性指向函数的原型。然后函数Ninja将作为您新创建的对象的构造函数被调用。它创建 swingSword 函数并使其成为对象的方法。

swingFire函数不会分配给您创建的对象,因为它是函数本身的方法,而不是其原型函数也是对象,因此它们实际上可以具有属性。

如果一个对象没有特定的属性或方法,它会查看它的原型。如果原型具有所述属性/方法,则使用它来代替。这意味着如果你给原型一个方法,每个使用它的对象也可以使用这个方法。这就是为什么将方法分配给函数原型的原因。

再次:观看视频,您将理解此解释。

于 2013-10-08T19:29:24.643 回答