var Ninja = function() {
this.swingSword = function() {
return true
}
}
Ninja.swingFire = function() {
return true
}
var ninja = new Ninja()
assert(ninja.swingFire()) // undefined
所以它正在创造一个Ninja的新对象,但为什么swingFire不包含在这种情况下呢?有人能解释一下原因吗?
答案 0 :(得分:8)
使用new
创建的实例将从constructor.prototype
继承,而不是从构造函数对象本身继承。这将按您的意愿行事:
Ninja.prototype.swingFire = function() {
return true;
}
答案 1 :(得分:1)
如果你想知道Javascript中的对象,函数,“类”和继承是如何工作的,你应该看一下这个视频:
面向对象JavaScript的权威指南: http://youtu.be/PMfcsYzj-9M
这是我见过的JS中面向对象的最佳解释。
在您的情况下,会发生以下情况:
创建new Ninja()
时,创建一个新的空对象({}
),其中包含指向函数原型的prototype属性。然后函数 Ninja 将被调用为新创建的对象的构造函数。它创建了swingSword函数,并使其成为对象的一种方法。
swingFire 函数将不分配给您创建的对象,因为它是函数本身的方法,而不是其原型。函数也是对象,因此它们实际上可以具有属性。
如果一个对象没有某个属性或方法,它会查看它的原型。如果原型具有所述属性/方法,则使用它代替。这意味着如果您为原型提供方法,则使用它的每个对象也可以使用此方法。这就是你将方法分配给函数原型的原因。
再次:观看视频,您将理解此解释。