我正在尝试使用Lo-Dash javascript库在javascript中模拟继承。
我只是使用_.extend来执行此操作:
function Parent() {
var self = this;
self.hello = function () {
console.log('Hello from parent');
};
}
function Child() {
var self = this;
_.extend(self, Parent);
}
Child.hello(); // Doesn't exist
我认为这样可行,因为所有的javascript函数都是对象,但显然我错了。为什么这不起作用,我将如何使用Lo-Dash正确模拟继承?
答案 0 :(得分:13)
See _.create documentation是一个有效的例子。
答案 1 :(得分:6)
Parent只是Parent类的构造函数,它本身不具有它添加到hello
的{{1}}属性。您只需将self
行更改为:_.extend
即可解决此问题。这是有效的,因为_.extend(self, new Parent())
返回的对象确实具有new Parent()
属性hello
可以复制到_.extend
。
要访问self
属性,您还必须创建hello
类的实例,而不是在构造函数上访问Child
。进行上述更改后,hello
应该有效,因为您访问(new Child()).hello()
实例上的hello
属性而不是构造函数。< / p>
但是,在我看来这是一个糟糕的解决方案,因为Child
将返回new Child() instanceof Parent
。如果你想正确设置原型链,那就是&#34; true&#34;继承你应该阅读有关伪科学和原型继承的文章。
答案 2 :(得分:4)
您可以使用_.create()
函数和prototype
来模拟继承。
function Parent() {}
Parent.prototype.hello = function() {
console.log('Hello from parent');
};
function Child() {}
Child.prototype = _.create(Parent.prototype, {
'constructor': Child
});
var child = new Child();
child.hello(); //Hello from parent