有最流行的JavaScript继承方法:
function extend(Child, Parent) {
var F = function() { }
F.prototype = Parent.prototype;
Child.prototype = new F();
Child.prototype.constructor = Child;
Child.superclass = Parent.prototype;
}
我现在正在学习JS,但我有很多Java经验,这种继承模型对我来说似乎有些困难。为什么我不能做以下事情:
function extend(Child, Parent) {
Child.prototype = Parent.prototype;
Child.prototype.constructor = Child;
}
我想我不了解/了解一些事情,但在我看来,F对象毫无用处。请澄清一下情况。谢谢。
答案 0 :(得分:5)
Child.prototype = Parent.prototype;
现在Child.prototype
和Parent.prototype
是同一个对象。
向Child.prototype
添加方法会将它们添加到Parent.prototype
,这是不经典OOP继承的工作原理。
答案 1 :(得分:2)
最重要的事情是JavaScript没有本机构建的经典继承。它不像Java,所以如果你想使用JavaScript的原型,你会想要把所有的Java继承思想抛到窗外。
原型的想法是你有一个连接到构造函数的对象。那是你的原型对象。您可以使用构造函数生成新对象,这些对象都可以访问构造函数原型中包含的方法。诀窍在于,如果您修改了附加到构造函数的原型,则现在将为构造函数创建的所有子对象更改您更改的方法。它的工作原理如下:
function Cat(name) {
this.name = name;
}
Cat.prototype = {
furColor: function () {
return 'gray';
}
};
var kitty1 = new Cat('Bob');
//=> {name: 'Bob'}
kitty1.furColor();
//=> 'gray'
Cat.prototype.furColor = function () {
return 'white';
}
var kitty2 = new Cat('Sally');
//=> {name: 'Sally'}
kitty2.furColor();
//=> 'white'
kitty1.furColor();
//=> 'white'
因此,如果您想从这个模型构建经典继承,您可以,但请记住,这是您使用JavaScript中的原型获得的。
有一个非常流行的经典继承插件,它为您提供了一些名为klass的优秀OO JavaScript,您可能希望尝试而不是自己动手。
答案 2 :(得分:0)
我认为javascript prototype
是对象的实际实例,如果您执行以下操作:
Child.prototype = Parent.prototype;
Child.prototype.constructor = Child;
你也将改变Parent
的原型,因为它们是对象的同一个实例。