在构造函数中返回方法时,javascript子类化未按预期工作
我不明白为什么在下面的代码中,在构造函数中返回方法时,javascript子类化未按预期工作,javascript,Javascript,我不明白为什么在下面的代码中,obj.BaseMethod不返回在BaseClass构造函数中定义的方法。换句话说,为什么会这样 SubClass.prototype.BaseMethod 定义了,但是 new SubClass().prototype.BaseMethod 没有定义 我显然错过了一些重要的事情 function BaseClass() { var privatestuff = "blah"; return { BaseMet
obj.BaseMethod
不返回在BaseClass
构造函数中定义的方法。换句话说,为什么会这样
SubClass.prototype.BaseMethod
定义了,但是
new SubClass().prototype.BaseMethod
没有定义
我显然错过了一些重要的事情
function BaseClass() {
var privatestuff = "blah";
return {
BaseMethod: function() {
console.log('BaseMethod called');
}
}
}
function SubClass() {
var moreprivates = "stuff";
return {
SubClassMethod: function() {
console.log('SubClassMethod called');
}
}
}
SubClass.prototype = new BaseClass();
var obj = new SubClass();
obj.SubClassMethod(); // SubClassMethod called
obj.BaseMethod(); // Uncaught TypeError: undefined is not a function
更新
我实际上理解了如何使用
this.method = function() { }
在我的构造函数中。我只是不明白为什么上面的代码没有做同样的事情
答案是,如果在构造函数中返回对象,则不再使用“protoypal”继承
我最清楚的是这个答案
引用Douglas Crockford在第5章JavaScript的继承:
(……)
道格拉斯·克罗克福德随后解释了新的运营商是如何运作的
作为JavaScript函数实现。此函数利用
书中还定义了其他几个函数,所以我用
(稍微)更简单的形式如下:
因此,简而言之,如果您在这个函数中返回一个对象,那么继承位实际上被忽略。下面是一种思考该语句的方法
new SubClass().prototype.BaseMethod
首先,new
关键字告诉JavaScript创建一个新的空对象,即{}
然后JavaScript将上下文(this
)设置为与新对象相等,并在new
之后调用函数。因此,在本例中,JavaScript将查找要调用的函数,但您的语法没有引用已定义的函数,因此结果是undefined
与JavaScript中定义对象的典型方法相比:
function ExampleObject() {
// stuff related to the example object
this.exampleProperty = "value";
}
var exObj = new ExampleOject();
在本例中,new
像以前一样创建空对象,{}
,但现在有一个已定义的函数要调用。调用此函数时,新创建的对象(设置为等于this
)将有一个exampleProperty
设置为等于“value”
。然后将生成的对象指定给变量exObj
对于那些来自Java背景(或类似背景)的人来说,这听起来可能很奇怪,但JavaScript并不真正支持类的概念。这门语言做出了一个不幸的选择,试图使它的原型继承看起来像经典继承,但实际上并不相同。如果你打算花大量时间在JavaScript上,你可能不想再试图从类和子类的角度来思考问题,而应该学习一些关于原型的知识。谢谢。我认为构造函数中返回的任何对象都会将其原型设置为构造函数的原型。但是我想这只会在你不返回对象的时候发生?这里有一个很好的原型,正如其他人所说的,你也可以省去新的,因为你的函数正在返回一个对象。可以使用Object.create设置任何对象的原型。也许以下答案有助于您理解原型和构造函数/初始化器函数:如果您喜欢私有变量,您可能会对以下答案感兴趣(它使用受保护的而不是私有的,因为私有实例特定的成员阻止您使用原型):
function ExampleObject() {
// stuff related to the example object
this.exampleProperty = "value";
}
var exObj = new ExampleOject();